_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E E N O N D E L E T T E S : */ /* */ /* */ /* Definition : */ /* */ /* Dans ce fichier se trouvent toutes */ /* les fonctions necessaires a la trans- */ /* formee en ondelettes. */ /* */ /* */ /* Cas mono-dimensionnel : */ /* --------------------- */ /* */ /* Soit une fonction "discrete" 'f' */ /* connue aux points (Xmin,...,Xmax), */ /* ce qui signifie que l'on connait les */ /* valeurs (f(Xmin),...,f(Xmax)). */ /* Designons par T(f) la transformee en */ /* ondelettes "discrete" de la fonction 'f'. */ /* */ /* Soit g(t) l'ondelette, ou 't' designe */ /* une variable continue; g(t) est en */ /* general une fonction a valeur complexe, */ /* mais sera supposee ici reelle afin de */ /* simplifier la programmation... */ /* */ /* La transformee en ondelette de f(u) */ /* par rapport a l'ondelette g(t) est */ /* definie au point (b,a) par : */ /* */ /* */ /* X=Xmax */ /* ___ */ /* \ 1 X-b */ /* T(f,(b,a)) = / ---.g(-----).f(X) ou 'b' est le parametre de position et 'a' le parametre d'echelle. */ /* --- a a */ /* X=Xmin */ /* */ /* L'algorithme qui suit fait l'hypothese */ /* que g(t) peut s'exprimer localement par un */ /* polynome de degre 3, plus exactement on */ /* ecrit que : */ /* */ /* 0 1 2 3 */ /* g(X + t) = C .t + C .t + C .t + C .t pour X E [nL,nR] ('X' entier), et t E [0,1[, */ /* X,0 X,1 X,2 X,3 */ /* */ /* g(t) = 0 pour t < 0 et t >= 1. */ /* */ /* */ /* Description de l'algorithme de Matthias Holschneider : */ /* ---------------------------------------------------- */ /* */ /* Soit : */ /* */ /* X=m */ /* ___ */ /* \ 0 */ /* S (m) = / X . f(X) */ /* 0 --- */ /* X=Xmin */ /* */ /* X=m */ /* ___ */ /* \ 1 */ /* S (m) = / X . f(X) */ /* 1 --- */ /* X=Xmin */ /* */ /* X=m */ /* ___ */ /* \ 2 */ /* S (m) = / X . f(X) */ /* 2 --- */ /* X=Xmin */ /* */ /* X=m */ /* ___ */ /* \ 3 */ /* S (m) = / X . f(X) */ /* 3 --- */ /* X=Xmin */ /* */ /* */ /* avec les conventions "limite" suivantes : */ /* */ /* */ /* S (m) = 0 si m<Xmin, */ /* i */ /* = S (Xmax) si m>Xmax. */ /* i */ /* */ /* */ /* On montre alors "aisement" que T(f,(b,a)) peut s'ecrire : */ /* */ /* X=nR */ /* ____ 0 1 2 3 */ /* \ B B B B */ /* T(f,(b,a)) = / {S [b + (X+1).a - 1] - S [b + (X).a - 1]} . {C .--- - C .--- + C .--- - C .---} + */ /* ---- 0 0 X,0 0 X,1 1 X,2 2 X,3 3 */ /* X=nL a a a a */ /* */ /* X=nR */ /* ____ 0 1 2 */ /* \ B B B */ /* / {S [b + (X+1).a - 1] - S [b + (X).a - 1]} . {C .--- - 2.C .--- + 3.C .---} + */ /* ---- 1 1 X,1 1 X,2 2 X,3 3 */ /* X=nL a a a */ /* */ /* X=nR */ /* ____ 0 1 */ /* \ B B */ /* / {S [b + (X+1).a - 1] - S [b + (X).a - 1]} . {C .--- - 3.C .---} + */ /* ---- 2 2 X,2 2 X,3 3 */ /* X=nL a a */ /* */ /* X=nR */ /* ____ 0 */ /* \ B */ /* / {S [b + (X+1).a - 1] - S [b + (X).a - 1]} . {C .---} */ /* ---- 3 3 X,3 3 */ /* X=nL a */ /* */ /* */ /* avec 'a' entier, et en posant : */ /* */ /* B = b + X.a */ /* */ /* */ /* Cas bi-dimensionnel : */ /* ------------------- */ /* */ /* Soit une fonction "discrete" 'f' */ /* connue aux points ((Xmin,Ymin),...,(Xmax,Ymax)) */ /* ce qui signifie que l'on connait les */ /* valeurs (f(Xmin,Ymin),...,f(Xmax,Ymax)) */ /* Designons par T(f) la transformee en */ /* ondelettes "discrete" de la fonction 'f'. */ /* */ /* Soit g(t) l'ondelette, ou 't' designe */ /* une variable continue; g(t) est en */ /* general une fonction a valeur complexe, */ /* mais sera supposee ici reelle afin de */ /* simplifier la programmation... */ /* */ /* La transformee en ondelette de f(u) */ /* par rapport a l'ondelette g(t) est */ /* definie au point (b,a) par : */ /* */ /* */ /* Y=Ymax X=Xmax */ /* ___ ___ X-b Y-b */ /* \ \ 1 x y */ /* T(f,(b,a)) = / / -------.g(------,------).f(X,Y) */ /* --- --- a .a a a */ /* Y=Ymin X=Xmin x y x y */ /* */ /* ou 'b' est le vecteur-parametre de position et 'a' le vecteur-parametre d'echelle. */ /* */ /* */ /* Author of '$ximt/ondelettes$FON' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 19890000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S V E R S I O N S : */ /* */ /*************************************************************************************************************************************/ #ifdef FONCTION_ONDELETTE_1D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ DEFV(Common,DEFV(Logical,_____FONCTION_ONDELETTE_1D_VERSION_01)); #Aifdef FONCTION_ONDELETTE_1D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #Eifdef FONCTION_ONDELETTE_1D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #ifdef FONCTION_ONDELETTE_1D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Logical,_____FONCTION_ONDELETTE_1D_VERSION_02)); #Aifdef FONCTION_ONDELETTE_1D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #Eifdef FONCTION_ONDELETTE_1D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #ifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ DEFV(Common,DEFV(Logical,_____CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_01)); #Aifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #Eifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #ifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Logical,_____CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_02)); #Aifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #Eifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #ifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ DEFV(Common,DEFV(Logical,_____APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_01)); #Aifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #Eifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #ifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Logical,_____APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_02)); #Aifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #Eifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' O N D E L E T T E D E M O R L E T M O N O - D I M E N S I O N N E L L E : */ /* */ /* */ /* Definition : */ /* */ /* L'ondelette de Morlet est definie */ /* en complexe par : */ /* */ /* 2 */ /* X */ /* - --- */ /* 2 */ /* e .[cos(F .X) + i.sin(F .X)] */ /* r i */ /* */ /* ou 'F ' et 'F ' designent respectivement */ /* r i */ /* les frequences 'reelle' et 'imaginaire'. */ /* */ /* */ /*************************************************************************************************************************************/ #define FREQUENCES_REELLE_ET_IMAGINAIRE \ FREQUENCE_DE_L_ONDELETTE \ /* Valeur initiale (et implicite) des frequences reelle et imaginaire de l'ondelette */ \ /* de Morlet. */ DEFV(Common,DEFV(Float,ZINT(Fondelettes_1D_____frequence_reelle,FREQUENCES_REELLE_ET_IMAGINAIRE))); /* Definition de la frequence de calcul de la partie reelle de l'ondelette de Morlet, */ DEFV(Common,DEFV(Float,ZINT(Fondelettes_1D_____frequence_imaginaire,FREQUENCES_REELLE_ET_IMAGINAIRE))); /* Definition de la frequence de calcul de la partie imaginaire de l'ondelette de Morlet. */ #undef FREQUENCES_REELLE_ET_IMAGINAIRE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R T I E R E E L L E D E L ' O N D E L E T T E D E M O R L E T */ /* M O N O - D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ BFonctionD DEFV(Common,DEFV(FonctionD,Fpartie_reelle_de_l_ondelette_1D_de_Morlet(variable))) DEFV(Argument,DEFV(Float,variable)); /* Valeur de la variable. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(partie_reelle,ONDELETTE_1D_DE_MORLET_PARTIE_REELLE(variable))); /* On renvoie la partie reelle. */ /*..............................................................................................................................*/ RETU(partie_reelle); Eblock EFonctionD /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R T I E I M A G I N A I R E D E L ' O N D E L E T T E D E M O R L E T : */ /* M O N O - D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ BFonctionD DEFV(Common,DEFV(FonctionD,Fpartie_imaginaire_de_l_ondelette_1D_de_Morlet(variable))) DEFV(Argument,DEFV(Float,variable)); /* Valeur de la variable. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(partie_imaginaire,ONDELETTE_1D_DE_MORLET_PARTIE_IMAGINAIRE(variable))); /* On renvoie la partie imaginaire. */ /*..............................................................................................................................*/ RETU(partie_imaginaire); Eblock EFonctionD /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' O N D E L E T T E D E M O R L E T */ /* M O N O - D I M E N S I O N N E L L E A P P R O C H E E : */ /* */ /* */ /* Definition : */ /* */ /* L'ondelette de Morlet est definie */ /* en complexe par : */ /* */ /* 2 */ /* X */ /* - --- */ /* 2 */ /* e .[cos(F .X) + i.sin(F .X)] */ /* r i */ /* */ /* ou 'F ' et 'F ' designent respectivement */ /* r i */ /* les frequences 'reelle' et 'imaginaire', */ /* et ou on developpe en serie entiere les */ /* fonctions, soit : */ /* */ /* 2 2 4 */ /* - 3 - F 15 + 10.F + F */ /* 2 r 2 r r */ /* F .X.[1 + X .(---------- + X .-----------------)] */ /* r 6 120 */ /* */ /* et : */ /* */ /* 2 2 4 */ /* - 1 - F 3 + 6.F + F */ /* 2 i 2 i i */ /* 1 + X .(---------- + X .---------------) */ /* 2 24 */ /* */ /* */ /*************************************************************************************************************************************/ #define FREQUENCES_REELLE_ET_IMAGINAIRE \ FREQUENCE_DE_L_ONDELETTE \ /* Valeur initiale (et implicite) des frequences reelle et imaginaire de l'ondelette */ \ /* de Morlet. */ DEFV(Common,DEFV(Float,ZINT(Fondelettes_1D_____approximation_frequence_reelle,FREQUENCES_REELLE_ET_IMAGINAIRE))); /* Definition de la frequence de calcul de la partie reelle de l'ondelette de Morlet, */ DEFV(Common,DEFV(Float,ZINT(Fondelettes_1D_____approximation_frequence_imaginaire,FREQUENCES_REELLE_ET_IMAGINAIRE))); /* Definition de la frequence de calcul de la partie imaginaire de l'ondelette de Morlet. */ #undef FREQUENCES_REELLE_ET_IMAGINAIRE DEFV(Local,DEFV(Float,INIT(Fondelettes_1D_____frequence_reelle_courante,FLOT__UNDEF))); /* Definition de la frequence courante de la partie reelle de l'ondelette de Morlet, */ DEFV(Local,DEFV(Float,INIT(coefficient_courant_R3,FLOT__UNDEF))); /* Coefficient du troisieme degre de la partie reelle, soit : */ /* */ /* 2 */ /* - 3 - F */ /* r */ /* ---------- */ /* 6 */ /* */ DEFV(Local,DEFV(Float,INIT(coefficient_courant_R5,FLOT__UNDEF))); /* Coefficient du cinquieme degre de la partie reelle, soit : */ /* */ /* 2 4 */ /* 15 + 10.F + F */ /* r r */ /* ----------------- */ /* 120 */ /* */ DEFV(Local,DEFV(Float,INIT(Fondelettes_1D_____frequence_imaginaire_courante,FLOT__UNDEF))); /* Definition de la frequence courante de la partie imaginaire de l'ondelette de Morlet. */ DEFV(Local,DEFV(Float,INIT(coefficient_courant_I2,FLOT__UNDEF))); /* Coefficient du deuxieme degre de la partie imaginaire, soit : */ /* */ /* 2 */ /* - 1 - F */ /* i */ /* ---------- */ /* 2 */ /* */ DEFV(Local,DEFV(Float,INIT(coefficient_courant_I4,FLOT__UNDEF))); /* Coefficient du quatrieme degre de la partie imaginaire, soit : */ /* */ /* 2 4 */ /* 3 + 6.F + F */ /* i i */ /* --------------- */ /* 24 */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R T I E R E E L L E D E L ' O N D E L E T T E D E M O R L E T */ /* M O N O - D I M E N S I O N N E L L E A P P R O C H E E : */ /* */ /*************************************************************************************************************************************/ BFonctionD DEFV(Common,DEFV(FonctionD,Fpartie_reelleA_de_l_ondelette_1D_de_Morlet(variable))) DEFV(Argument,DEFV(Float,variable)); /* Valeur de la variable. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(partie_reelle,FLOT__UNDEF)); /* On renvoie la partie reelle. */ /*..............................................................................................................................*/ Test(IFNE(Fondelettes_1D_____frequence_reelle_courante,Fondelettes_1D_____approximation_frequence_reelle)) Bblock EGAL(Fondelettes_1D_____frequence_reelle_courante,Fondelettes_1D_____approximation_frequence_reelle); /* Definition de la frequence courante de la partie reelle de l'ondelette de Morlet, */ EGAL(coefficient_courant_R3 ,DIVI(NEGA(ADD2(FLOT(TROIS),EXP2(Fondelettes_1D_____frequence_reelle_courante))) ,FLOT(MUL2(TROIS,MUL2(DEUX,UN))) ) ); /* Coefficient du troisieme degre de la partie reelle, soit : */ /* */ /* 2 */ /* - 3 - F */ /* r */ /* ---------- */ /* 6 */ /* */ EGAL(coefficient_courant_R5 ,DIVI(ADD3(FLOT(QUINZE) ,MUL2(FLOT(DIX),EXP2(Fondelettes_1D_____frequence_reelle_courante)) ,EXP4(Fondelettes_1D_____frequence_reelle_courante) ) ,FLOT(MUL2(CINQ,MUL2(QUATRE,MUL2(TROIS,MUL2(DEUX,UN))))) ) ); /* Coefficient du cinquieme degre de la partie reelle, soit : */ /* */ /* 2 4 */ /* 15 + 10.F + F */ /* r r */ /* ----------------- */ /* 120 */ /* */ Eblock ATes Bblock Eblock ETes EGAL(partie_reelle ,MUL2(AXPB(AXPB(coefficient_courant_R5 ,EXP2(variable) ,coefficient_courant_R3 ) ,EXP2(variable) ,FU ) ,MUL2(Fondelettes_1D_____frequence_reelle_courante,variable) ) ); RETU(partie_reelle); Eblock EFonctionD /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R T I E I M A G I N A I R E D E L ' O N D E L E T T E D E M O R L E T */ /* M O N O - D I M E N S I O N N E L L E A P P R O C H E E : */ /* */ /*************************************************************************************************************************************/ BFonctionD DEFV(Common,DEFV(FonctionD,Fpartie_imaginaireA_de_l_ondelette_1D_de_Morlet(variable))) DEFV(Argument,DEFV(Float,variable)); /* Valeur de la variable. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(partie_imaginaire,FLOT__UNDEF)); /* On renvoie la partie imaginaire. */ /*..............................................................................................................................*/ Test(IFNE(Fondelettes_1D_____frequence_imaginaire_courante ,Fondelettes_1D_____approximation_frequence_imaginaire ) ) Bblock EGAL(Fondelettes_1D_____frequence_imaginaire_courante ,Fondelettes_1D_____approximation_frequence_imaginaire ); /* Definition de la frequence courante de la partie imaginaire de l'ondelette de Morlet. */ EGAL(coefficient_courant_I2 ,DIVI(NEGA(ADD2(FU,EXP2(Fondelettes_1D_____frequence_imaginaire_courante))) ,FLOT(MUL2(DEUX,UN)) ) ); /* Coefficient du deuxieme degre de la partie imaginaire, soit : */ /* */ /* 2 */ /* - 1 - F */ /* i */ /* ---------- */ /* 2 */ /* */ EGAL(coefficient_courant_I4 ,DIVI(ADD3(FLOT(TROIS) ,MUL2(FLOT(SIX),EXP2(Fondelettes_1D_____frequence_imaginaire_courante)) ,EXP4(Fondelettes_1D_____frequence_imaginaire_courante) ) ,FLOT(MUL2(QUATRE,MUL2(TROIS,MUL2(DEUX,UN)))) ) ); /* Coefficient du quatrieme degre de la partie imaginaire, soit : */ /* */ /* 2 4 */ /* 3 + 6.F + F */ /* i i */ /* --------------- */ /* 24 */ /* */ Eblock ATes Bblock Eblock ETes EGAL(partie_imaginaire ,AXPB(AXPB(coefficient_courant_I4 ,EXP2(variable) ,coefficient_courant_I2 ) ,EXP2(variable) ,FU ) ); RETU(partie_imaginaire); Eblock EFonctionD /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E E N O N D E L E T T E S M O N O - D I M E N S I O N N E L L E */ /* R E E L L E E T N O N A P P R O X I M E E ( O U " P A R F A I T E " ) : */ /* */ /*************************************************************************************************************************************/ BFonctionD DEFV(Common,DEFV(FonctionD,Fondelettes_1D_reelles_parfaites(fonction ,ARGUMENT_POINTERs(parametre_de_position_1D) ,ARGUMENT_POINTERs(parametre_d_echelle_1D) ,ARGUMENT_FONCTION(ondelette) ) ) ) DEFV(Argument,DEFV(ligneD,fonction)); /* Vecteur contenant la fonction discrete argument. */ DEFV(Argument,DEFV(pointF_1D,POINTERs(parametre_de_position_1D))); /* Parametre de position ('b') qui est dans [0,1], et qui apres '_cDENORMALISE_OX()' */ /* sera un nombre entier... */ DEFV(Argument,DEFV(coeffF_1D,POINTERs(parametre_d_echelle_1D))); /* Parametre d'echelle ('a'). */ DEFV(Argument,DEFV(Float,afPOINTEUR(ondelette))); /* Definition de l'ondelette (par exemple, celle de Morlet -parties reelle et imaginaire-). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(pointD_1D,coordonnees_de_l_ondelette); /* Coordonnee obtenue a partir de 'X', en tant que coordonnee de l'ondelette. */ DEFV(Double,INIT(cumul_courant,FZERO)); /* Cumul courant donnant a la derniere etape ('INDEX_DE_DROITE_DE_L_ONDELETTE_1D') */ /* la valeur de la transformee de la fonction en (b,a). */ /*..............................................................................................................................*/ Test(IZLE(ASI1(parametre_d_echelle_1D,cx))) Bblock PRINT_ERREUR("le facteur d'echelle est negatif ou nul"); Eblock ATes Bblock Eblock ETes Test(IFGE(INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,INDEX_DE_DROITE_DE_L_ONDELETTE_1D)) Bblock PRINT_ERREUR("la definition des indices de l'ondelette est mauvaise"); Eblock ATes Bblock Eblock ETes begin_ligne Bblock INITIALISATION_POINT_1D(coordonnees_de_l_ondelette ,DIVI(DPRE(SOUS(FLOT(X),F__cDENORMALISE_OX(ASI1(parametre_de_position_1D,x)))) ,DPRE(ASI1(parametre_d_echelle_1D,cx)) ) ); /* Calcul de la coordonnee d'acces a l'ondelette : */ /* */ /* X-b */ /* ----- */ /* a */ /* */ Test(INCLff(ASD1(coordonnees_de_l_ondelette,x) ,DPRE(INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D) ,DPRE(INDEX_DE_DROITE_DE_L_ONDELETTE_1D) ) ) Bblock INCR(cumul_courant ,MUL2(fPOINTEUR(ondelette)(ASD1(coordonnees_de_l_ondelette,x)) ,LIGNE(fonction,X,Ymin) ) ); /* Iteration de calcul du produit de convolution entre la fonction et l'ondelette : */ /* */ /* X=Xmax */ /* ___ */ /* \ 1 X-b */ /* T(f,(b,a)) = / ---.g(-----).f(X) */ /* --- a a */ /* X=Xmin */ /* */ /* ou encore : */ /* */ /* X=Xmax */ /* ___ */ /* 1 \ X-b */ /* T(f,(b,a)) = ---./ g(-----).f(X) */ /* a --- a */ /* X=Xmin */ /* */ /* ou 'b' est le parametre de position et 'a' le parametre d'echelle. */ Eblock ATes Bblock Eblock ETes Eblock end_ligne RETU(DIVI(cumul_courant,ASI1(parametre_d_echelle_1D,cx))); /* Renvoi de la valeur reelle de la transformee cherchee... */ Eblock EFonctionD /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O N D E L E T T E D E M O R L E T B I - D I M E N S I O N N E L L E : */ /* */ /* */ /* Definition : */ /* */ /* Un champ dit "de Morlet" est defini par */ /* l'equation : */ /* */ /* 2 2 */ /* X + Y */ /* - --------- */ /* 2 i.(|k|.cos(t).X + |k|.sin(t).Y) */ /* F(X,Y) = e .e */ /* */ /* ou : */ /* */ /* X */ /* X = --- */ /* a */ /* */ /* et : */ /* */ /* Y */ /* Y = --- */ /* a */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Float,ZINT(Fondelettes_1D_____dilatation_ondelette_2D_de_Morlet,FU))); /* Coefficient de dilatation des coordonnees. */ DEFV(Common,DEFV(Float,ZINT(Fondelettes_1D_____phase_ondelette_2D_de_Morlet,FZERO))); /* Angle 't' dans l'equation ci-dessus. */ DEFV(Common,DEFV(Float,ZINT(Fondelettes_1D_____module_ondelette_2D_de_Morlet,FU))); /* Module |k| dans l'equation ci-dessus. */ DEFV(Local,DEFV(Float,INIT(Fondelettes_1D_____phase_ondelette_2D_de_Morlet_courante,FLOT__UNDEF))); /* Valeur courante de l'angle 't' dans l'equation ci-dessus ; celle-ci permet de savoir */ /* si les produits |k|.cos(t) et |k|.sin(t) ont ete initialises. */ DEFV(Local,DEFV(Float,INIT(kcost_ondelette_2D_de_Morlet_courant,FLOT__UNDEF))); /* Valeur courante du produit |k|.cos(t), */ DEFV(Local,DEFV(Float,INIT(ksint_ondelette_2D_de_Morlet_courant,FLOT__UNDEF))); /* Valeur courante du produit |k|.sin(t). */ #define DONNEES_DE_CALCUL_DE_L_ONDELETTE_DE_MORLET_2D \ DEFV(Float,INIT(Xf_dilate,DIVI(Xf,Fondelettes_1D_____dilatation_ondelette_2D_de_Morlet))); \ /* Abscisse dilatee, */ \ DEFV(Float,INIT(Yf_dilate,DIVI(Yf,Fondelettes_1D_____dilatation_ondelette_2D_de_Morlet))); \ /* Ordonnee dilatee, */ \ DEFV(Float,INIT(fxy,FLOT__UNDEF)); \ /* Valeur de la fonction 'Fxy' pour un champ Morlet. */ #define ACCELERATION_ONDELETTE_DE_MORLET_2D \ Bblock \ Test(IFNE(Fondelettes_1D_____phase_ondelette_2D_de_Morlet_courante \ ,Fondelettes_1D_____phase_ondelette_2D_de_Morlet \ ) \ ) \ Bblock \ EGAL(kcost_ondelette_2D_de_Morlet_courant \ ,MUL2(Fondelettes_1D_____module_ondelette_2D_de_Morlet \ ,COSX(Fondelettes_1D_____phase_ondelette_2D_de_Morlet) \ ) \ ); \ /* Valeur courante du produit |k|.cos(t), */ \ EGAL(ksint_ondelette_2D_de_Morlet_courant \ ,MUL2(Fondelettes_1D_____module_ondelette_2D_de_Morlet \ ,SINX(Fondelettes_1D_____phase_ondelette_2D_de_Morlet) \ ) \ ); \ /* Valeur courante du produit |k|.sin(t). */ \ EGAL(Fondelettes_1D_____phase_ondelette_2D_de_Morlet_courante \ ,Fondelettes_1D_____phase_ondelette_2D_de_Morlet \ ); \ /* Valeur courante de l'angle 't' dans l'equation ci-dessus ; celle-ci permet de savoir */ \ /* si les produits |k|.cos(t) et |k|.sin(t) ont ete initialises. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Permet d'eviter le recalcul systematique de |k|.cos(t) et |k|.sin(t). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O N D E L E T T E D E M O R L E T P A R T I E R E E L L E B I - D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,Fpartie_reelle_de_l_ondelette_2D_de_Morlet(Xf,Yf))) DEFV(Argument,DEFV(Float,Xf)); DEFV(Argument,DEFV(Float,Yf)); /* Coordonnees flottantes 'Xf' et 'Yf' dans [0,1[. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DONNEES_DE_CALCUL_DE_L_ONDELETTE_DE_MORLET_2D /*..............................................................................................................................*/ ACCELERATION_ONDELETTE_DE_MORLET_2D; EGAL(fxy ,MUL2(EXPB(NEGA(MOIT(ADD2(EXP2(Xf_dilate),EXP2(Yf_dilate)) ) ) ) ,COSX(ADD2(MUL2(kcost_ondelette_2D_de_Morlet_courant,Xf_dilate) ,MUL2(ksint_ondelette_2D_de_Morlet_courant,Yf_dilate) ) ) ) ); /* On notera que l'on utilise 'EXPB(...)' et non pas 'EXPX(...)' a cause du bug */ /* 'BUG_SYSTEME_SG_C_exp'... */ RETU(fxy); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O N D E L E T T E D E M O R L E T P A R T I E I M A G I N A I R E B I - D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,Fpartie_imaginaire_de_l_ondelette_2D_de_Morlet(Xf,Yf))) DEFV(Argument,DEFV(Float,Xf)); DEFV(Argument,DEFV(Float,Yf)); /* Coordonnees flottantes 'Xf' et 'Yf' dans [0,1[. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DONNEES_DE_CALCUL_DE_L_ONDELETTE_DE_MORLET_2D /*..............................................................................................................................*/ ACCELERATION_ONDELETTE_DE_MORLET_2D; EGAL(fxy ,MUL2(EXPB(NEGA(MOIT(ADD2(EXP2(Xf_dilate),EXP2(Yf_dilate)) ) ) ) ,SINX(ADD2(MUL2(kcost_ondelette_2D_de_Morlet_courant,Xf_dilate) ,MUL2(ksint_ondelette_2D_de_Morlet_courant,Yf_dilate) ) ) ) ); /* On notera que l'on utilise 'EXPB(...)' et non pas 'EXPX(...)' a cause du bug */ /* 'BUG_SYSTEME_SG_C_exp'... */ RETU(fxy); Eblock EFonctionF #undef ACCELERATION_ONDELETTE_DE_MORLET_2D #undef DONNEES_DE_CALCUL_DE_L_ONDELETTE_DE_MORLET_2D /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E E N O N D E L E T T E S B I - D I M E N S I O N N E L L E */ /* R E E L L E E T N O N A P P R O X I M E E ( O U " P A R F A I T E " ) : */ /* */ /*************************************************************************************************************************************/ BFonctionD DEFV(Common,DEFV(FonctionD,Fondelettes_2D_reelles_parfaites(fonction ,ARGUMENT_POINTERs(parametre_de_position_2D) ,ARGUMENT_POINTERs(parametre_d_echelle_2D) ,ARGUMENT_FONCTION(ondelette) ) ) ) DEFV(Argument,DEFV(imageD,fonction)); /* Vecteur contenant la fonction discrete argument. */ DEFV(Argument,DEFV(pointF_2D,POINTERs(parametre_de_position_2D))); /* Parametre de position ('b') qui est dans [0,1], et qui apres '_cDENORMALISE_OX()' */ /* sera un nombre entier... */ DEFV(Argument,DEFV(coeffF_2D,POINTERs(parametre_d_echelle_2D))); /* Parametre d'echelle ('a'). */ DEFV(Argument,DEFV(Float,afPOINTEUR(ondelette))); /* Definition de l'ondelette (par exemple, celle de Morlet -parties reelle et imaginaire-). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(pointD_2D,coordonnees_de_l_ondelette); /* Coordonnees de l'ondelette obtenues a partir de {X,Y}. */ DEFV(Double,INIT(cumul_courant,FZERO)); /* Cumul courant donnant a la derniere etape ('INDEX_DE_DROITE_DE_L_ONDELETTE_2D' et */ /* 'INDEX_DU_HAUT_DE_L_ONDELETTE_2D') la valeur de la transformee de la fonction en (b,a). */ /*..............................................................................................................................*/ Test(IFOU(IZLE(ASI1(parametre_d_echelle_2D,cx)) ,IZLE(ASI1(parametre_d_echelle_2D,cx)) ) ) Bblock PRINT_ERREUR("le facteur d'echelle est negatif ou nul"); Eblock ATes Bblock Eblock ETes Test(IFOU(IFGE(INDEX_DE_GAUCHE_DE_L_ONDELETTE_2D,INDEX_DE_DROITE_DE_L_ONDELETTE_2D) ,IFGE(INDEX_DU_BAS_DE_L_ONDELETTE_2D,INDEX_DU_HAUT_DE_L_ONDELETTE_2D) ) ) Bblock PRINT_ERREUR("la definition des indices de l'ondelette est mauvaise"); Eblock ATes Bblock Eblock ETes begin_image Bblock INITIALISATION_POINT_2D(coordonnees_de_l_ondelette ,DIVI(DPRE(SOUS(FLOT(X),F__cDENORMALISE_OX(ASI1(parametre_de_position_2D,x)))) ,DPRE(ASI1(parametre_d_echelle_2D,cx)) ) ,DIVI(DPRE(SOUS(FLOT(Y),F__cDENORMALISE_OY(ASI1(parametre_de_position_2D,y)))) ,DPRE(ASI1(parametre_d_echelle_2D,cy)) ) ); /* Calcul de l'abscisse d'acces a l'ondelette : */ /* */ /* X-b */ /* x */ /* ------ */ /* a */ /* x */ /* */ /* et, */ /* */ /* calcul de l'ordonnee d'acces a l'ondelette : */ /* */ /* Y-b */ /* y */ /* ------ */ /* a */ /* y */ /* */ Test(IFET(INCLff(ASD1(coordonnees_de_l_ondelette,x) ,DPRE(INDEX_DE_GAUCHE_DE_L_ONDELETTE_2D) ,DPRE(INDEX_DE_DROITE_DE_L_ONDELETTE_2D) ) ,INCLff(ASD1(coordonnees_de_l_ondelette,y) ,DPRE(INDEX_DU_BAS_DE_L_ONDELETTE_2D) ,DPRE(INDEX_DU_HAUT_DE_L_ONDELETTE_2D) ) ) ) Bblock INCR(cumul_courant ,MUL2(fPOINTEUR(ondelette)(ASD1(coordonnees_de_l_ondelette,x),ASD1(coordonnees_de_l_ondelette,y)) ,loadD_point(fonction,X,Y) ) ); /* Iteration de calcul du produit de convolution entre la fonction et l'ondelette : */ /* */ /* Y=Ymax X=Xmax */ /* ___ ___ X-b Y-b */ /* \ \ 1 x y */ /* T(f,(b,a)) = / / -------.g(------,------).f(X,Y) */ /* --- --- a .a a a */ /* Y=Ymin X=Xmin x y x y */ /* */ /* ou encore : */ /* */ /* Y=Ymax X=Xmax */ /* ___ ___ X-b Y-b */ /* 1 \ \ x y */ /* T(f,(b,a)) = -------. / / g(------,------).f(X,Y) */ /* a .a --- --- a a */ /* x y Y=Ymin X=Xmin x y */ /* */ /* ou 'b' est le vecteur-parametre de position et 'a' le vecteur-parametre d'echelle. */ /* */ Eblock ATes Bblock Eblock ETes Eblock end_image RETU(DIVI(cumul_courant,MUL2(ASI1(parametre_d_echelle_2D,cx),ASI1(parametre_d_echelle_2D,cy)))); /* Renvoi de la valeur reelle de la transformee cherchee... */ Eblock EFonctionD /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' O N D E L E T T E M O N O - D I M E N S I O N N E L L E */ /* A P P R O X I M E E P A R U N S P L I N E C U B I Q U E M O N O - D I M E N S I O N N E L : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Float,DTb1(Fondelettes_1D_____coefficient_X0_de_l_ondelette,LONGUEUR_DE_L_ONDELETTE_1D))); /* Definition des coefficients C de l'ondelette. */ /* X,0 */ DEFV(Common,DEFV(Float,DTb1(Fondelettes_1D_____coefficient_X1_de_l_ondelette,LONGUEUR_DE_L_ONDELETTE_1D))); /* Definition des coefficients C de l'ondelette. */ /* X,1 */ DEFV(Common,DEFV(Float,DTb1(Fondelettes_1D_____coefficient_X2_de_l_ondelette,LONGUEUR_DE_L_ONDELETTE_1D))); /* Definition des coefficients C de l'ondelette. */ /* X,2 */ DEFV(Common,DEFV(Float,DTb1(Fondelettes_1D_____coefficient_X3_de_l_ondelette,LONGUEUR_DE_L_ONDELETTE_1D))); /* Definition des coefficients C de l'ondelette. */ /* X,3 */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' A C C E L E R A T E U R M O N O - D I M E N S I O N N E L : */ /* */ /*************************************************************************************************************************************/ #define ACCES_AUX_CUMULS(cumul_S,x,y) \ COND(IFLT(x,Xmin) \ ,FZERO \ ,LIGNE(cumul_S,x,y) \ ) \ /* Primitive d'acces a l'element 'x' de l'un des cumuls, avec les conventions "limites" */ \ /* suivantes : */ \ /* */ \ /* S (m) = 0 si m<Xmin (prise en compte ici), */ \ /* i */ \ /* = S (Xmax) si m>Xmax (prise en compte lors du calcul de 'x'). */ \ /* i */ \ /* */ DEFV(Local,DEFV(Logical,INIT(etat_des_cumuls_S,INVALIDE))); /* Indicateur precisant si le calcul de S , S , S et S a ete fait. */ /* 0 1 2 3 */ #ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 DEFV(Local,DEFV(Statique,DEFV(ligneD,Fondelettes_1D_____cumul_S_X0))); /* Pour contenir S , */ /* 0 */ DEFV(Local,DEFV(Statique,DEFV(ligneD,Fondelettes_1D_____cumul_S_X1))); /* Pour contenir S , */ /* 1 */ DEFV(Local,DEFV(Statique,DEFV(ligneD,Fondelettes_1D_____cumul_S_X2))); /* Pour contenir S , */ /* 2 */ DEFV(Local,DEFV(Statique,DEFV(ligneD,Fondelettes_1D_____cumul_S_X3))); /* Pour contenir S . */ /* 3 */ #Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 #Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 #ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 /* Common,DEFV(Fonction,) : objets statiques. */ /* voir le commentaire associe aux declarations 'static' lors de '$PASSE_7' de */ /* 'v $xcc/cpp$Z', ainsi que l'initialisation de la liste '$liste_utiles' qui y est faite... */ /* Le 20040521092725, le '#pragma' relatif a 'xcc__cpp_Z__liste_utiles' a ete introduit */ /* pour supprimer cette dependance... */ #pragma xcc__cpp_Z__liste_utiles $ximt/ondelettes$EXT Fondelettes_1D_____cumul_S_X0 $xbmt/ondelettes DEFV(Common,DEFV(Statique,DEFV(ligneD,Fondelettes_1D_____cumul_S_X0))); /* Pour contenir S , */ /* 0 */ #pragma xcc__cpp_Z__liste_utiles $ximt/ondelettes$EXT Fondelettes_1D_____cumul_S_X1 $xbmt/ondelettes DEFV(Common,DEFV(Statique,DEFV(ligneD,Fondelettes_1D_____cumul_S_X1))); /* Pour contenir S , */ /* 1 */ #pragma xcc__cpp_Z__liste_utiles $ximt/ondelettes$EXT Fondelettes_1D_____cumul_S_X2 $xbmt/ondelettes DEFV(Common,DEFV(Statique,DEFV(ligneD,Fondelettes_1D_____cumul_S_X2))); /* Pour contenir S , */ /* 2 */ #pragma xcc__cpp_Z__liste_utiles $ximt/ondelettes$EXT Fondelettes_1D_____cumul_S_X3 $xbmt/ondelettes DEFV(Common,DEFV(Statique,DEFV(ligneD,Fondelettes_1D_____cumul_S_X3))); /* Pour contenir S . */ /* 3 */ #Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 /* Common,DEFV(Fonction,) : objets statiques. */ #Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 /* Common,DEFV(Fonction,) : objets statiques. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E E N O N D E L E T T E S M O N O - D I M E N S I O N N E L L E */ /* R E L L E E T A P P R O X I M E E : */ /* */ /*************************************************************************************************************************************/ BFonctionD #define PARAMETRE_DE_POSITION_X \ AXPB(ASI1(parametre_d_echelle_1D,cx) \ ,DPRE(X) \ ,DPRE(F__cDENORMALISE_OX(ASI1(parametre_de_position_1D,x))) \ ) \ /* Primitive permettant de calculer le parametre 'B' a partir de 'b'... */ DEFV(Common,DEFV(FonctionD,Fondelettes_1D_reelles_approximees(fonction ,ARGUMENT_POINTERs(parametre_de_position_1D) ,ARGUMENT_POINTERs(parametre_d_echelle_1D) ,il_faut_initialiser_les_cumuls_S ) ) ) DEFV(Argument,DEFV(ligneD,fonction)); /* Vecteur contenant la fonction discrete argument. */ DEFV(Argument,DEFV(pointF_1D,POINTERs(parametre_de_position_1D))); /* Parametre de position ('b') qui est dans [0,1], et qui apres '_cDENORMALISE_OX()' */ /* sera un nombre entier... */ DEFV(Argument,DEFV(coeffF_1D,POINTERs(parametre_d_echelle_1D))); /* Parametre d'echelle ('a'). */ DEFV(Argument,DEFV(Logical,il_faut_initialiser_les_cumuls_S)); /* Cet indicateur indique s'il faut ('VRAI') ou pas ('FAUX') forcer la (re-)initialisation */ /* des differents cumuls 'cumul_S'... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(X_gauche,UNDEF)); DEFV(Int,INIT(X_droite,UNDEF)); /* Calcul pour 'X' courant des deux points (dits 'gauche' et 'droite' ou prendre les */ /* cumuls 'cumul_S' pour faire les differences)... */ DEFV(Double,INIT(cumul_courant,FZERO)); /* Cumul courant donnant a la derniere etape ('INDEX_DE_DROITE_DE_L_ONDELETTE_1D') */ /* la valeur de la transformee de la fonction en (b,a). */ DEFV(coeffD_1D,parametre_d_echelle_1D_P0); /* Parametre d'echelle ('a') a la puissance 0, */ DEFV(coeffD_1D,parametre_d_echelle_1D_P1); /* Parametre d'echelle ('a') a la puissance 1, */ DEFV(coeffD_1D,parametre_d_echelle_1D_P2); /* Parametre d'echelle ('a') a la puissance 2, */ DEFV(coeffD_1D,parametre_d_echelle_1D_P3); /* Parametre d'echelle ('a') a la puissance 3. */ DEFV(Double,INIT(ponderateur_du_premier_ordre,DPRE(UNDEF))); /* Valeur de l'expression : */ /* */ /* 0 1 2 3 */ /* B B B B */ /* C .--- - C .--- + C .--- - C .--- */ /* X,0 0 X,1 1 X,2 2 X,3 3 */ /* a a a a */ /* */ DEFV(Double,INIT(ponderateur_du_deuxieme_ordre,DPRE(UNDEF))); /* Valeur de l'expression : */ /* */ /* 0 1 2 */ /* B B B */ /* C .--- - 2.C .--- + 3.C .--- */ /* X,1 1 X,2 2 X,3 3 */ /* a a a */ /* */ DEFV(Double,INIT(ponderateur_du_troisieme_ordre,DPRE(UNDEF))); /* Valeur de l'expression : */ /* */ /* 0 1 */ /* B B */ /* C .--- - 3.C .--- */ /* X,2 2 X,3 3 */ /* a a */ /* */ DEFV(Double,INIT(ponderateur_du_quatrieme_ordre,DPRE(UNDEF))); /* Valeur de l'expression : */ /* */ /* 0 */ /* B */ /* C .--- */ /* X,3 3 */ /* a */ /* */ /*..............................................................................................................................*/ Test(IZLE(ASI1(parametre_d_echelle_1D,cx))) Bblock PRINT_ERREUR("le facteur d'echelle est negatif ou nul"); Eblock ATes Bblock Eblock ETes Test(NINCff(CENTRE_DE_L_ONDELETTE_1D,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,INDEX_DE_DROITE_DE_L_ONDELETTE_1D)) Bblock PRINT_ERREUR("la definition des indices de l'ondelette est mauvaise"); Eblock ATes Bblock Eblock ETes Test(IFOU(EST_VRAI(il_faut_initialiser_les_cumuls_S),EST_INVALIDE(etat_des_cumuls_S))) Bblock begin_ligne Bblock Test(IFLE(INTX(X),Xmin)) Bblock EGAL(LIGNE(Fondelettes_1D_____cumul_S_X0,X,Ymin) ,LIGNE(fonction,X,Ymin) ); /* Initialisation du premier accelerateur : */ /* */ /* S (0) = f(0). */ /* 0 */ /* */ EGAL(LIGNE(Fondelettes_1D_____cumul_S_X1,X,Ymin) ,FZERO ); /* Initialisation du second accelerateur : */ /* */ /* S (0) = 0. */ /* 1 */ /* */ EGAL(LIGNE(Fondelettes_1D_____cumul_S_X2,X,Ymin) ,FZERO ); /* Initialisation du troisieme accelerateur : */ /* */ /* S (0) = 0. */ /* 2 */ /* */ EGAL(LIGNE(Fondelettes_1D_____cumul_S_X3,X,Ymin) ,FZERO ); /* Initialisation du quatrieme accelerateur : */ /* */ /* S (0) = 0. */ /* 3 */ /* */ Eblock ATes Bblock EGAL(LIGNE(Fondelettes_1D_____cumul_S_X0,X,Ymin) ,AXPB(EXP0(COXR(X)) ,LIGNE(fonction,X,Ymin) ,LIGNE(Fondelettes_1D_____cumul_S_X0,PREX(X),Ymin) ) ); /* Calcul du premier accelerateur : */ /* */ /* 0 */ /* S (X) = X .f(X) + S (X-1). */ /* 0 0 */ /* */ EGAL(LIGNE(Fondelettes_1D_____cumul_S_X1,X,Ymin) ,AXPB(EXP1(COXR(X)) ,LIGNE(fonction,X,Ymin) ,LIGNE(Fondelettes_1D_____cumul_S_X1,PREX(X),Ymin) ) ); /* Calcul du second accelerateur : */ /* */ /* 1 */ /* S (X) = X .f(X) + S (X-1). */ /* 1 1 */ /* */ EGAL(LIGNE(Fondelettes_1D_____cumul_S_X2,X,Ymin) ,AXPB(EXP2(COXR(X)) ,LIGNE(fonction,X,Ymin) ,LIGNE(Fondelettes_1D_____cumul_S_X2,PREX(X),Ymin) ) ); /* Calcul du troisieme accelerateur : */ /* */ /* 2 */ /* S (X) = X .f(X) + S (X-1). */ /* 2 2 */ /* */ EGAL(LIGNE(Fondelettes_1D_____cumul_S_X3,X,Ymin) ,AXPB(EXP3(COXR(X)) ,LIGNE(fonction,X,Ymin) ,LIGNE(Fondelettes_1D_____cumul_S_X3,PREX(X),Ymin) ) ); /* Calcul du quatrieme accelerateur : */ /* */ /* 3 */ /* S (X) = X .f(X) + S (X-1). */ /* 3 3 */ /* */ Eblock ETes Eblock end_ligne EGAL(etat_des_cumuls_S,VALIDE); /* L'initialisation de l'accelerateur est achevee... */ Eblock ATes Bblock Eblock ETes INITIALISATION_COEFFICIENT_1D(parametre_d_echelle_1D_P0,EXP0(ASI1(parametre_d_echelle_1D,cx))); INITIALISATION_COEFFICIENT_1D(parametre_d_echelle_1D_P1,EXP1(ASI1(parametre_d_echelle_1D,cx))); INITIALISATION_COEFFICIENT_1D(parametre_d_echelle_1D_P2,EXP2(ASI1(parametre_d_echelle_1D,cx))); INITIALISATION_COEFFICIENT_1D(parametre_d_echelle_1D_P3,EXP3(ASI1(parametre_d_echelle_1D,cx))); /* Preparation des differentes puissances du parametre d'echelle... */ begin_ligneQ(DoIn,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,INDEX_DE_DROITE_DE_L_ONDELETTE_1D,PasX) Bblock /* Iteration de calcul du produit de convolution entre la fonction et l'ondelette. */ EGAL(X_gauche ,MIN2(INTX(COXA(AXPB(ASI1(parametre_d_echelle_1D,cx) ,FLOT(COXR(NEUT(X))) ,FLOT(PREX(F__cDENORMALISE_OX(ASI1(parametre_de_position_1D,x)))) ) ) ) ,Xmax ) ); EGAL(X_droite ,MIN2(INTX(COXA(AXPB(ASI1(parametre_d_echelle_1D,cx) ,FLOT(COXR(SUCX(X))) ,FLOT(PREX(F__cDENORMALISE_OX(ASI1(parametre_de_position_1D,x)))) ) ) ) ,Xmax ) ); /* Calcul pour 'X' courant des deux points (dits 'gauche' et 'droite' ou prendre les */ /* cumuls 'cumul_S' pour faire les differences). Les conditions "limites" suivantes sont */ /* utilisees : */ /* */ /* S (m) = 0 si m<0 (prise en compte a l'utilisation de 'X'), */ /* i */ /* = S (Xmax) si m>Xmax (prise en compte ici). */ /* i */ /* */ EGAL(ponderateur_du_premier_ordre ,HORNER_1_03(PARAMETRE_DE_POSITION_X ,NEUT(NEGA(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X3_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P3,cx) ) ) ) ,NEUT(NEUT(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X2_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P2,cx) ) ) ) ,NEUT(NEGA(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X1_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P1,cx) ) ) ) ,NEUT(NEUT(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X0_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P0,cx) ) ) ) ) ); /* Calcul de la valeur de l'expression (suivant le schema de Horner) : */ /* */ /* 0 1 2 3 */ /* B B B B */ /* C .--- - C .--- + C .--- - C .--- */ /* X,0 0 X,1 1 X,2 2 X,3 3 */ /* a a a a */ /* */ EGAL(ponderateur_du_deuxieme_ordre ,HORNER_1_02(PARAMETRE_DE_POSITION_X ,NEUT(TRIP(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X3_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P3,cx) ) ) ) ,NEGA(DOUB(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X2_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P2,cx) ) ) ) ,NEUT(NEUT(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X1_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P1,cx) ) ) ) ) ); /* Calcul de la valeur de l'expression (suivant le schema de Horner) : */ /* */ /* 0 1 2 */ /* B B B */ /* C .--- - 2.C .--- + 3.C .--- */ /* X,1 1 X,2 2 X,3 3 */ /* a a a */ /* */ EGAL(ponderateur_du_troisieme_ordre ,HORNER_1_01(PARAMETRE_DE_POSITION_X ,NEGA(TRIP(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X3_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P3,cx) ) ) ) ,NEUT(NEUT(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X2_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P2,cx) ) ) ) ) ); /* Calcul de la valeur de l'expression (suivant le schema de Horner) : */ /* */ /* 0 1 */ /* B B */ /* C .--- - 3.C .--- */ /* X,2 2 X,3 3 */ /* a a */ /* */ EGAL(ponderateur_du_quatrieme_ordre ,HORNER_1_00(PARAMETRE_DE_POSITION_X ,NEUT(NEUT(VALEUR_DE_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X3_de_l_ondelette ,X,Ymin ,ASD1(parametre_d_echelle_1D_P3,cx) ) ) ) ) ); /* Calcul de la valeur de l'expression (suivant le schema de Horner) : */ /* */ /* 0 */ /* B */ /* C .--- */ /* X,3 3 */ /* a */ /* */ INCR(cumul_courant ,ADD4(MUL2(ponderateur_du_premier_ordre ,SOUS(ACCES_AUX_CUMULS(Fondelettes_1D_____cumul_S_X0,X_droite,Ymin) ,ACCES_AUX_CUMULS(Fondelettes_1D_____cumul_S_X0,X_gauche,Ymin) ) ) ,MUL2(ponderateur_du_deuxieme_ordre ,SOUS(ACCES_AUX_CUMULS(Fondelettes_1D_____cumul_S_X1,X_droite,Ymin) ,ACCES_AUX_CUMULS(Fondelettes_1D_____cumul_S_X1,X_gauche,Ymin) ) ) ,MUL2(ponderateur_du_troisieme_ordre ,SOUS(ACCES_AUX_CUMULS(Fondelettes_1D_____cumul_S_X2,X_droite,Ymin) ,ACCES_AUX_CUMULS(Fondelettes_1D_____cumul_S_X2,X_gauche,Ymin) ) ) ,MUL2(ponderateur_du_quatrieme_ordre ,SOUS(ACCES_AUX_CUMULS(Fondelettes_1D_____cumul_S_X3,X_droite,Ymin) ,ACCES_AUX_CUMULS(Fondelettes_1D_____cumul_S_X3,X_gauche,Ymin) ) ) ) ); Eblock end_ligneQ(EDoI) RETU(DIVI(cumul_courant,ASI1(parametre_d_echelle_1D,cx))); /* Renvoi de la valeur reelle de la transformee cherchee... */ Eblock #undef PARAMETRE_DE_POSITION_X EFonctionD #undef ACCES_AUX_CUMULS /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E E N O N D E L E T T E S B I - D I M E N S I O N N E L L E R E E L L E */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Iondelettes_2D_reelles(imageR ,imageA ,ARGUMENT_POINTERs(parametre_d_echelleA_2D) ,renormaliser_l_image ,ARGUMENT_FONCTION(ondelette) ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image transformee de l'image argument. */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument. */ DEFV(Argument,DEFV(coeffF_2D,POINTERs(parametre_d_echelleA_2D))); /* Parametre d'echelle ('a'). */ DEFV(Argument,DEFV(Logical,renormaliser_l_image)); /* Indicateur precisant s'il faut a priori renormaliser 'imageR' ('VRAI') */ /* ou laisser choisir le programme en fonction du couple (minimum,maximum) */ /* calcule ('FAUX'). */ DEFV(Argument,DEFV(Float,afPOINTEUR(ondelette))); /* Definition de l'ondelette (par exemple, celle de Morlet -parties reelle et imaginaire-). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(pointF_2D,parametre_de_position_2D); /* Parametre de position pour la transformee mono-dimensionnelle ('b'). */ DEFV(coeffF_2D,parametre_d_echelle_2D); /* Parametre d'echelle pour la transformee mono-dimensionnelle ('a'). */ BDEFV(imageD,image_courante); /* Image courante, */ DEFV(Double,INIT(minimum_de_la_transformee,DPRE(UNDEF))); DEFV(Double,INIT(maximum_de_la_transformee,DPRE(UNDEF))); /* Donnent le minimum et le maximum de la transformee finale flottante. */ /*..............................................................................................................................*/ INITIALISATION_COEFFICIENT_2D(parametre_d_echelle_2D ,ASI1(parametre_d_echelleA_2D,cx) ,ASI1(parametre_d_echelleA_2D,cy) ); /* Initialisation du parametre d'echelle bi-dimensionnel. */ begin_image Bblock storeD_point(load_point(imageA,X,Y),image_courante,X,Y); /* Conversion de l'image Argument en la fonction a transformer. */ Eblock end_image begin_image Bblock INITIALISATION_POINT_2D(parametre_de_position_2D ,_____cNORMALISE_OX(X) ,_____cNORMALISE_OY(Y) ); /* Initialisation du parametre de position a l'aide des coordonnees courantes {X,Y}. */ storeD_point(Fondelettes_2D_reelles_parfaites(image_courante ,ADRESSE(parametre_de_position_2D) ,ADRESSE(parametre_d_echelle_2D) ,aFONCTION(ondelette) ) ,image_courante ,X,Y ); /* Generation de la transformee en ondelettes bi-dimensionelle, point apres point... */ Eblock end_image CALS(IDnivo_extrema(image_courante ,ADRESSE(minimum_de_la_transformee) ,ADRESSE(maximum_de_la_transformee) ) ); /* Recherche du minimum et du maximum de la transformee finale flottante. */ Test(IFOU(IL_FAUT(renormaliser_l_image) ,IFOU(IFLT(minimum_de_la_transformee,FLOT__NOIR) ,IFGT(maximum_de_la_transformee,FLOT__BLANC) ) ) ) /* Nota : on n'oubliera pas que par definition 'minimum <= maximum'... */ Bblock CALS(Idouble_std(imageR ,image_courante ,minimum_de_la_transformee ,maximum_de_la_transformee ) ); /* Lorsque les niveaux minimal et maximal sont hors de [NOIR,BLANC], */ /* ou bien si la renormalisation explicite est demandee, on renormalise... */ Eblock ATes Bblock CALS(Idouble_std(imageR ,image_courante ,FLOT__NOIR ,FLOT__BLANC ) ); /* Les niveaux minimal et maximal sont dans [NOIR,BLANC] et on */ /* ne renormalise pas... */ Eblock ETes EDEFV(imageD,image_courante); /* Image courante. */ RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E E N O N D E L E T T E S B I - D I M E N S I O N N E L L E R E E L L E */ /* O B T E N U E P A R P R O D U I T D E D E U X T R A N S F O R M E E S E N O N D E L E T T E S */ /* M O N O - D I M E N S I O N N E L L E S O R T H O G O N A L E S E T R E E L L E S : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Iondelettes_2D_HV_reelles(imageR ,imageA ,ARGUMENT_POINTERs(parametre_d_echelleA_2D) ,renormaliser_l_image ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image transformee de l'image argument. */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument. */ DEFV(Argument,DEFV(coeffF_2D,POINTERs(parametre_d_echelleA_2D))); /* Parametre d'echelle ('a'). */ DEFV(Argument,DEFV(Logical,renormaliser_l_image)); /* Indicateur precisant s'il faut a priori renormaliser 'imageR' ('VRAI') */ /* ou laisser choisir le programme en fonction du couple (minimum,maximum) */ /* calcule ('FAUX'). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(pointF_1D,parametre_de_position_1D); /* Parametre de position pour la transformee mono-dimensionnelle ('b'). */ DEFV(coeffF_1D,parametre_d_echelle_1D); /* Parametre d'echelle pour la transformee mono-dimensionnelle ('a'). */ BDEFV(ligneD,ligne_courante); /* Ligne courante, */ BDEFV(colonneD,colonne_courante); /* Colonne courante, */ BDEFV(imageF,transformeeH_de_l_imageA); /* Image transformee de l'image argument (elle est dite Horizontale, car elle correspond */ /* a la premiere etape qui s'interesee aux lignes). */ BDEFV(imageF,transformeeV_de_l_imageA); /* Image transformee de l'image argument (elle est dite Verticale, car elle correspond */ /* a la deuxieme etape qui s'interesee aux colonnes). */ DEFV(Logical,INIT(il_faut_initialiser_les_cumuls_S,LUNDEF)); /* Cet indicateur indique s'il faut ('VRAI') ou pas ('FAUX') forcer la (re-)initialisation */ /* des differents cumuls 'cumul_S'... */ DEFV(genere_Float,INIT(minimum_de_la_transformee,FLOT__UNDEF)); DEFV(genere_Float,INIT(maximum_de_la_transformee,FLOT__UNDEF)); /* Donnent le minimum et le maximum de la transformee finale flottante. */ /*..............................................................................................................................*/ Test(IFOU(IFNE(dimX,dimY) ,IFNE(pasX,pasY) ) ) Bblock PRINT_ERREUR("la definition des images est incompatible avec l'algorithme"); Eblock ATes Bblock Eblock ETes INITIALISATION_COEFFICIENT_1D(parametre_d_echelle_1D,ASI1(parametre_d_echelleA_2D,cx)); /* Initialisation du parametre d'echelle mono-dimensionnel sur la dimension horizontale. */ begin_colonne Bblock /* On transforme d'abord horizontalement : */ /* */ /* Y ^ */ /* | ---------------- */ /* | ---------------- */ /* | ---------------- */ /* | ---------------- */ /* | ---------------- */ /* -O--------------------> */ /* | X */ /* */ /* (ligne apres ligne). */ begin_ligne Bblock EGAL(LIGNE(ligne_courante,X,Y) ,DPRE(load_point(imageA,X,Y)) ); /* Recuperation de la ligne courante dans 'imageA' (c'est-a-dire */ /* l'image Argument), */ Eblock end_ligne EGAL(il_faut_initialiser_les_cumuls_S,VRAI); /* Ainsi, on ree-initialise les 'cumul_S' au debut de chaque ligne... */ begin_ligne Bblock INITIALISATION_POINT_1D(parametre_de_position_1D,_____cNORMALISE_OX(X)); /* Initialisation du parametre de position a l'aide de l'abscisse courante 'X'. */ storeF_point(Fondelettes_1D_reelles(ligne_courante ,ADRESSE(parametre_de_position_1D) ,ADRESSE(parametre_d_echelle_1D) ,il_faut_initialiser_les_cumuls_S ,ONDELETTE_1D_REELLE ) ,transformeeH_de_l_imageA ,X,Y ); /* Generation de la transformee en ondelettes bi-dimensionelle, ligne */ /* apres ligne... */ EGAL(il_faut_initialiser_les_cumuls_S,FAUX); /* Ainsi, on ree-initialise les 'cumul_S' au debut de chaque ligne... */ Eblock end_ligne Eblock end_colonne INITIALISATION_COEFFICIENT_1D(parametre_d_echelle_1D,ASI1(parametre_d_echelleA_2D,cy)); /* Initialisation du parametre d'echelle mono-dimensionnel sur la dimension verticale. */ begin_ligne Bblock /* Puis, on transforme verticalement : */ /* */ /* Y ^ */ /* | | | | | | | | | */ /* | | | | | | | | | */ /* | | | | | | | | | */ /* | | | | | | | | | */ /* | | | | | | | | | */ /* -O--------------------> */ /* | X */ /* */ /* (colonne apres colonne). */ begin_colonne Bblock EGAL(COLONNE(colonne_courante,X,Y) ,DPRE(loadF_point(transformeeH_de_l_imageA,X,Y)) ); /* Recuperation de la colonne courante dans 'transformeeH_de_l_imageA' */ /* (c'est-a-dire la transformee en ondelettes "horizontale" de 'imageA'), */ Eblock end_colonne EGAL(il_faut_initialiser_les_cumuls_S,VRAI); /* Ainsi, on ree-initialise les 'cumul_S' au debut de chaque colonne... */ begin_colonne Bblock INITIALISATION_POINT_1D(parametre_de_position_1D,_____cNORMALISE_OY(Y)); /* Initialisation du parametre de position a l'aide de l'ordonnee courante 'Y'. */ storeF_point(Fondelettes_1D_reelles(colonne_courante ,ADRESSE(parametre_de_position_1D) ,ADRESSE(parametre_d_echelle_1D) ,il_faut_initialiser_les_cumuls_S ,ONDELETTE_1D_REELLE ) ,transformeeV_de_l_imageA ,X,Y ); /* Generation de la transformee en ondelettes bi-dimensionelle, colonne */ /* apres colonne... */ EGAL(il_faut_initialiser_les_cumuls_S,FAUX); /* Ainsi, on re-initialise les 'cumul_S' au debut de chaque colonne... */ Eblock end_colonne Eblock end_ligne CALS(IFnivo_extrema(transformeeV_de_l_imageA ,ADRESSE(minimum_de_la_transformee) ,ADRESSE(maximum_de_la_transformee) ) ); /* Recherche du minimum et du maximum de la transformee finale flottante. */ Test(IFOU(IL_FAUT(renormaliser_l_image) ,IFOU(IFLT(minimum_de_la_transformee,FLOT__NOIR) ,IFGT(maximum_de_la_transformee,FLOT__BLANC) ) ) ) /* Nota : on n'oubliera pas que par definition 'minimum <= maximum'... */ Bblock CALS(Ifloat_std(imageR ,transformeeV_de_l_imageA ,minimum_de_la_transformee ,maximum_de_la_transformee ) ); /* Lorsque les niveaux minimal et maximal sont hors de [NOIR,BLANC], */ /* ou bien si la renormalisation explicite est demandee, on renormalise... */ Eblock ATes Bblock CALS(Ifloat_std(imageR ,transformeeV_de_l_imageA ,FLOT__NOIR ,FLOT__BLANC ) ); /* Les niveaux minimal et maximal sont dans [NOIR,BLANC] et on */ /* ne renormalise pas... */ Eblock ETes EDEFV(imageF,transformeeV_de_l_imageA); /* Image transformee de l'image argument (elle est dite Verticale, car elle correspond */ /* a la deuxieme etape qui s'interesee aux colonnes). */ EDEFV(imageF,transformeeH_de_l_imageA); /* Image transformee de l'image argument (elle est dite Horizontale, car elle correspond */ /* a la premiere etape qui s'interesee aux lignes). */ EDEFV(colonneD,colonne_courante); /* Colonne courante, */ EDEFV(ligneD,ligne_courante); /* Ligne courante. */ RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E E N O N D E L E T T E S M O N O - D I M E N S I O N N E L L E C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define INTERPOLATION_DES_ECHELLES(y) \ BARY(parametre_d_echelle_minimal \ ,parametre_d_echelle_maximal \ ,DIVI(FLOT(COYR(y)),FLOT(COYR(Ymax))) \ ) \ /* Definition du passage de la coordonnee 'Y' au parametre d'echelle. */ #define PARAMETRE_D_ECHELLE(y) \ COND(IL_FAUT(echelles_lineaires) \ ,INTERPOLATION_DES_ECHELLES(y) \ ,EXPB(INTERPOLATION_DES_ECHELLES(y)) \ ) \ /* Definition du passage de la coordonnee 'Y' au parametre d'echelle. */ \ /* */ \ /* On notera que l'on utilise 'EXPB(...)' et non pas 'EXPX(...)' a cause du bug */ \ /* 'BUG_SYSTEME_SG_C_exp'... */ DEFV(Common,DEFV(FonctionI,Iondelettes_1D_complexes(partie_reelleR ,partie_imaginaireR ,moduleR ,phaseR ,fonction ,ARGUMENT_POINTERs(frequences) ,echelles_lineaires ,parametre_d_echelle_minimal ,parametre_d_echelle_maximal ) ) ) DEFV(Argument,DEFV(image,partie_reelleR)); /* Image dans laquelle se trouvera au retour la partie reelle des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a', */ DEFV(Argument,DEFV(image,partie_imaginaireR)); /* Image dans laquelle se trouvera au retour la partie imaginaire des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a'. */ DEFV(Argument,DEFV(image,moduleR)); /* Image contenant le module au retour, */ DEFV(Argument,DEFV(image,phaseR)); /* Image contenant la phase au retour. */ DEFV(Argument,DEFV(ligneD,fonction)); /* Vecteur contenant la fonction discrete argument. */ DEFV(Argument,DEFV(coeffF_2D,POINTERs(frequences))); /* Frequences 'reelle' et 'imaginaire' argument pour initialiser l'ondelette de Morlet ; en */ /* general le couple (PI,PI) sera utilise. */ DEFV(Argument,DEFV(Logical,echelles_lineaires)); /* Cet indicateur precise si les echelles a utiliser sont lineaires ('VRAI') ou */ /* logarithmiques ('FAUX'). */ DEFV(Argument,DEFV(Float,parametre_d_echelle_minimal)); /* Valeur minimale du parametre d'echelle, */ DEFV(Argument,DEFV(Float,parametre_d_echelle_maximal)); /* Valeur maximale du parametre d'echelle. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(Logical,INIT(reinitialisation_des_cumuls_S,VRAI)); /* Indicateur destine a forcer l'initialisation des 'cumul_S' la toute premiere fois ; par */ /* la suite, ces valeurs seront valables aussi bien pour la partie reelle que pour la */ /* partie imaginaire. */ DEFV(pointF_1D,parametre_de_position_1D); /* Parametre de position ('b'). */ DEFV(coeffF_1D,parametre_d_echelle_1D); /* Parametre d'echelle ('a'). */ BDEFV(imageF,partie_reelle); /* Matrice flottante dans laquelle se trouvera la partie reelle des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a', */ BDEFV(imageF,partie_imaginaire); /* Matrice flottante dans laquelle se trouvera la partie imaginaire des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a'. */ BDEFV(imageF,module); /* Matrice flottante dans laquelle se trouvera le module des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a'. */ BDEFV(imageF,phase); /* Matrice flottante dans laquelle se trouvera la phase des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a'. */ /*..............................................................................................................................*/ EGAL(Fondelettes_1D_____frequence_reelle,ASI1(frequences,cx)); GENERATION_DE_LA_PARTIE_REELLE_DE_L_ONDELETTE_1D; /* Initialisation de l'ondelette avec la partie reelle. */ begin_image Bblock INITIALISATION_COEFFICIENT_1D(parametre_d_echelle_1D,PARAMETRE_D_ECHELLE(Y)); INITIALISATION_POINT_1D(parametre_de_position_1D,_____cNORMALISE_OX(X)); /* Initialisation des parametres d'echelle et de position avec 'Y' et 'X' respectivement. */ storeF_point(Fondelettes_1D_reelles(fonction ,ADRESSE(parametre_de_position_1D) ,ADRESSE(parametre_d_echelle_1D) ,reinitialisation_des_cumuls_S ,ONDELETTE_1D_PARTIE_REELLE ) ,partie_reelle ,X,Y ); /* Calcul de la partie reelle de la transformee. */ EGAL(reinitialisation_des_cumuls_S,FAUX); /* Afin de ne plus faire aucune reinitialisation des 'cumul_S'. */ Eblock end_image CALS(Ifloat_std_avec_renormalisation(partie_reelleR ,partie_reelle ) ); /* Generation de l'image "partie reelle" (avec renormalisation). */ EGAL(Fondelettes_1D_____frequence_imaginaire,ASI1(frequences,cy)); GENERATION_DE_LA_PARTIE_IMAGINAIRE_DE_L_ONDELETTE_1D; begin_image Bblock INITIALISATION_COEFFICIENT_1D(parametre_d_echelle_1D,PARAMETRE_D_ECHELLE(Y)); INITIALISATION_POINT_1D(parametre_de_position_1D,_____cNORMALISE_OX(X)); /* Initialisation des parametres d'echelle et de position avec 'Y' et 'X' respectivement. */ storeF_point(Fondelettes_1D_reelles(fonction ,ADRESSE(parametre_de_position_1D) ,ADRESSE(parametre_d_echelle_1D) ,reinitialisation_des_cumuls_S ,ONDELETTE_1D_PARTIE_IMAGINAIRE ) ,partie_imaginaire ,X,Y ); /* Calcul de la partie imaginaire de la transformee. */ EGAL(reinitialisation_des_cumuls_S,FAUX); /* Afin de ne plus faire aucune reinitialisation des 'cumul_S' (inutile ici puisqu'il */ /* a ete fait lors de l'iteration sur la partie reelle). */ Eblock end_image CALS(Ifloat_std_avec_renormalisation(partie_imaginaireR ,partie_imaginaire ) ); /* Generation de l'image "partie imaginaire" (avec renormalisation). */ CALS(Iconversion_XY_RT(module,phase ,partie_reelle,partie_imaginaire ) ); /* Calcul des modules et des phases dans [0,2.PI], puis dans [NOIR,BLANC]... */ CALS(Ifloat_std_avec_renormalisation(moduleR ,module ) ); /* Generation de l'image "module" (avec renormalisation). */ CALS(Ifloat_std(phaseR ,phase ,FZERO ,CERCLE_TRIGONOMETRIQUE ) ); /* Generation de l'image "phase" (sans renormalisation, afin de conserver toute */ /* l'information, et en particulier voir des "trous" dans [0,2.PI]). */ EDEFV(imageF,phase); /* Matrice flottante dans laquelle se trouvera la phase des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a'. */ EDEFV(imageF,module); /* Matrice flottante dans laquelle se trouvera le module des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a'. */ EDEFV(imageF,partie_imaginaire); /* Matrice flottante dans laquelle se trouvera la partie imaginaire des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a'. */ EDEFV(imageF,partie_reelle); /* Matrice flottante dans laquelle se trouvera la partie reelle des transformees */ /* complexes mono_dimensionnelles de la fonction pour des valeurs differentes du */ /* parametre 'a'. */ RETU_ERROR; Eblock #undef PARAMETRE_D_ECHELLE #undef INTERPOLATION_DES_ECHELLES EFonctionI _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A P P R O X I M A T I O N D ' U N E F O N C T I O N E C H A N T I L L O N E E */ /* P A R U N S P L I N E C U B I Q U E M O N O - D I M E N S I O N N E L : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define PREMIER_ELEMENT_DE_LA_FONCTION \ INDEX0 \ /* Premier element des vecteurs de definition de la fonction et des vecteurs */ \ /* des coefficients d'approximation. */ #define DELTA_VECTEUR(ITbX,vecteur,indice2,indice1) \ SOUS(ITbX(vecteur,INDX(indice2,PREMIER_ELEMENT_DE_LA_FONCTION)) \ ,ITbX(vecteur,INDX(indice1,PREMIER_ELEMENT_DE_LA_FONCTION)) \ ) \ /* Calcul d'un accroissement sur un 'vecteur' d'un indice (1) a un autre (2). */ DEFV(Common,DEFV(FonctionI,Fapproximation_par_un_spline_cubique(coefficients_de_degre_0 ,coefficients_de_degre_1 ,coefficients_de_degre_2 ,coefficients_de_degre_3 ,liste_des_abscisses ,liste_des_ordonnees ,premiere_derivee_premiere ,derniere_derivee_premiere ,nombre_d_echantillons ) ) ) DEFV(Argument,DEFV(Float,DTb0(coefficients_de_degre_0))); DEFV(Argument,DEFV(Float,DTb0(coefficients_de_degre_1))); DEFV(Argument,DEFV(Float,DTb0(coefficients_de_degre_2))); DEFV(Argument,DEFV(Float,DTb0(coefficients_de_degre_3))); /* Vecteurs donnant au retour les coeficients respectifs des quatre puissances */ /* de la variable 'X' (a savoir 0, 1, 2 et 3). Mais ATTENTION, il est renvoye ainsi */ /* un point de moins que la fonction n'en contient... */ DEFV(Argument,DEFV(Float,DTb0(liste_des_abscisses))); DEFV(Argument,DEFV(Float,DTb0(liste_des_ordonnees))); /* Vecteurs contenant a l'entree la definition en {X,Y} de la fonction echantillonnee. Mais */ /* ils contiennent un point de plus que n'en contiennent au retour les coefficients */ /* ci-dessus... */ DEFV(Argument,DEFV(Float,premiere_derivee_premiere)); DEFV(Argument,DEFV(Float,derniere_derivee_premiere)); /* Definition de la derivee premiere de la fonction argument au premier et au */ /* dernier points respectivement. */ DEFV(Argument,DEFV(Positive,nombre_d_echantillons)); /* Nombre d'echantillons definissant la fonction argument en {X,Y}, c'est donc la dimension */ /* des vecteurs 'liste_des_abscisses' et 'liste_des_ordonnees', mais c'est la dimension */ /* plus 1 des quatre vecteurs de coefficients renvoyes au 'RETU'... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(Float,DdTb1(POINTERf ,derivee_seconde ,nombre_d_echantillons ,fMalo(MUL2(nombre_d_echantillons,size_Float)) ) ); /* Allocation d'un vecteur destine a stocker la derivee seconde en chaque point. */ DEFV(Float,DdTb1(POINTERf ,vecteur_de_manoeuvre ,nombre_d_echantillons ,fMalo(MUL2(nombre_d_echantillons,size_Float)) ) ); /* Allocation d'un vecteur de manoeuvre. */ DEFV(Int,INIT(index,UNDEF)); /* Definition de l'index d'iteration. */ DEFV(Float,INIT(taux_de_variation_de_l_abscisse,FLOT__UNDEF)); /* Pour calculer le taux de variation des abscisses. */ DEFV(Float,INIT(produit_du_taux_par_la_derivee_seconde,FLOT__UNDEF)); /* Pour calculer le produit du taux de variation de l'abscisse par la derivee seconde. */ /*..............................................................................................................................*/ EGAL(IdTb1(derivee_seconde,INDX(PREMIER_ELEMENT_DE_LA_FONCTION,PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons),NEGA(FDU)); EGAL(IdTb1(vecteur_de_manoeuvre,INDX(PREMIER_ELEMENT_DE_LA_FONCTION,PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ,MUL2(TRIP(fINVZ(DELTA_VECTEUR(ITb0 ,liste_des_abscisses ,SUCC(PREMIER_ELEMENT_DE_LA_FONCTION) ,NEUT(PREMIER_ELEMENT_DE_LA_FONCTION) ) ) ) ,SOUS(fDIVZ(DELTA_VECTEUR(ITb0 ,liste_des_ordonnees ,SUCC(PREMIER_ELEMENT_DE_LA_FONCTION) ,NEUT(PREMIER_ELEMENT_DE_LA_FONCTION) ) ,DELTA_VECTEUR(ITb0 ,liste_des_abscisses ,SUCC(PREMIER_ELEMENT_DE_LA_FONCTION) ,NEUT(PREMIER_ELEMENT_DE_LA_FONCTION) ) ) ,premiere_derivee_premiere ) ) ); /* Initialisation de l'iteration suivante... */ /* */ /* Le 20071201105658 'DIVZ(...)' et 'INVZ(...)' furent remplaces tardivement par */ /* 'fDIVZ(...)' et 'fINVZ(...)'... */ DoIn(index ,SUCC(PREMIER_ELEMENT_DE_LA_FONCTION) ,PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PasX ) Bblock EGAL(taux_de_variation_de_l_abscisse ,fDIVZ(DELTA_VECTEUR(ITb0,liste_des_abscisses,NEUT(index),PRED(index)) ,DELTA_VECTEUR(ITb0,liste_des_abscisses,SUCC(index),PRED(index)) ) ); /* Pour calculer le taux de variation des abscisses. */ /* */ /* Le 20071201110339 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ EGAL(produit_du_taux_par_la_derivee_seconde ,ADD2(MUL2(taux_de_variation_de_l_abscisse ,IdTb1(derivee_seconde,INDX(PRED(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ) ,FDEUX ) ); /* Pour calculer le produit du taux de variation de l'abscisse par la derviee seconde. */ EGAL(IdTb1(derivee_seconde,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ,fDIVZ(SOUS(taux_de_variation_de_l_abscisse ,FU ) ,produit_du_taux_par_la_derivee_seconde ) ); /* Calcul "provisoire" de la derivee seconde. */ /* */ /* Le 20071201110339 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ EGAL(IdTb1(vecteur_de_manoeuvre,INDX(NEUT(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ,fDIVZ(SOUS(GRO6(fDIVZ(SOUS(fDIVZ(DELTA_VECTEUR(ITb0,liste_des_ordonnees,SUCC(index),NEUT(index)) ,DELTA_VECTEUR(ITb0,liste_des_abscisses,SUCC(index),NEUT(index)) ) ,fDIVZ(DELTA_VECTEUR(ITb0,liste_des_ordonnees,NEUT(index),PRED(index)) ,DELTA_VECTEUR(ITb0,liste_des_abscisses,NEUT(index),PRED(index)) ) ) ,DELTA_VECTEUR(ITb0,liste_des_abscisses,SUCC(index),PRED(index)) ) ) ,MUL2(taux_de_variation_de_l_abscisse ,IdTb1(vecteur_de_manoeuvre,INDX(PRED(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ) ) ,produit_du_taux_par_la_derivee_seconde ) ); /* Calcul du mysterieux vecteur de manoeuvre... */ /* */ /* Le 20071201110339 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ Eblock EDoI EGAL(IdTb1(vecteur_de_manoeuvre ,INDX(NEUT(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PREMIER_ELEMENT_DE_LA_FONCTION ) ,nombre_d_echantillons ) ,MUL2(FLOT(TROIS) ,fDIVZ(SOUS(derniere_derivee_premiere ,fDIVZ(DELTA_VECTEUR(ITb0 ,liste_des_ordonnees ,NEUT(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ) ,DELTA_VECTEUR(ITb0 ,liste_des_abscisses ,NEUT(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ) ) ) ,DELTA_VECTEUR(ITb0 ,liste_des_abscisses ,NEUT(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ) ) ) ); /* Le 20071201110339 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ EGAL(IdTb1(derivee_seconde ,INDX(NEUT(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PREMIER_ELEMENT_DE_LA_FONCTION ) ,nombre_d_echantillons ) ,fDIVZ(SOUS(NEUT(IdTb1(vecteur_de_manoeuvre ,INDX(NEUT(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PREMIER_ELEMENT_DE_LA_FONCTION ) ,nombre_d_echantillons ) ) ,MOIT(IdTb1(vecteur_de_manoeuvre ,INDX(PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PREMIER_ELEMENT_DE_LA_FONCTION ) ,nombre_d_echantillons ) ) ) ,ADD2(FU ,MOIT(IdTb1(derivee_seconde ,INDX(PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)),PREMIER_ELEMENT_DE_LA_FONCTION) ,nombre_d_echantillons ) ) ) ) ); /* Calcul "provisoire" de la derivee seconde. */ /* */ /* Le 20071201110339 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ DoDe(index ,PREMIER_ELEMENT_DE_LA_FONCTION ,PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PasX ) Bblock EGAL(IdTb1(derivee_seconde,INDX(NEUT(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ,ADD2(MUL2(IdTb1(derivee_seconde,INDX(NEUT(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ,IdTb1(derivee_seconde,INDX(SUCC(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ) ,IdTb1(vecteur_de_manoeuvre,INDX(NEUT(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons) ) ); /* Calcul final de la derivee seconde... */ Eblock EDoD DoIn(index ,PREMIER_ELEMENT_DE_LA_FONCTION ,PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PasX ) Bblock EGAL(ITb1(coefficients_de_degre_0,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,ITb1(liste_des_ordonnees,INDX(NEUT(index),PREMIER_ELEMENT_DE_LA_FONCTION)) ); /* */ /* C = Y(i) */ /* 0,i */ /* */ EGAL(ITb1(coefficients_de_degre_1,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,SOUS(fDIVZ(DELTA_VECTEUR(ITb0,liste_des_ordonnees,SUCC(index),NEUT(index)) ,DELTA_VECTEUR(ITb0,liste_des_abscisses,SUCC(index),NEUT(index)) ) ,TIER(ADD2(NEUT(IdTb1(derivee_seconde,INDX(NEUT(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons)) ,MOIT(IdTb1(derivee_seconde,INDX(SUCC(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons)) ) ) ) ); /* */ /* 2 2 */ /* Y(i+1) - Y(i) 1 d Y 1 d Y */ /* C = --------------- - ---.[-----(i) + ---.-----(i+1)] */ /* 1,i X(i+1) - X(i) 3 2 2 2 */ /* d X d X */ /* */ /* Le 20071201110339 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ EGAL(ITb1(coefficients_de_degre_2,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,MOIT(IdTb1(derivee_seconde,INDX(NEUT(index),PREMIER_ELEMENT_DE_LA_FONCTION),nombre_d_echantillons)) ); /* */ /* 2 */ /* 1 d Y */ /* C = ---.-----(i) */ /* 2,i 2 2 */ /* d X */ /* */ EGAL(ITb1(coefficients_de_degre_3,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,FRA6(fDIVZ(DELTA_VECTEUR(ITb1,derivee_seconde,SUCC(index),NEUT(index)) ,DELTA_VECTEUR(ITb0,liste_des_abscisses,SUCC(index),NEUT(index)) ) ) ); /* */ /* 2 2 */ /* d Y d Y */ /* -----(i+1) - -----(i) */ /* 2 2 */ /* 1 d X d X */ /* C = ---.----------------------- */ /* 3,i 6 X(i+1) - X(i) */ /* */ /* */ Eblock EDoI /* Nota : l'element 'nombre_d_echantillons' des quatre vecteurs de coefficients n'existe */ /* pas, et n'est donc pas calcule... */ FdTb1(vecteur_de_manoeuvre,nombre_d_echantillons,Float,ADRESSE_PLUS_DEFINIE); /* Liberation du vecteur mysterieux... */ /* */ /* Le 'ADRESSE_PLUS_DEFINIE' a ete introduit le 20050221170441... */ FdTb1(derivee_seconde,nombre_d_echantillons,Float,ADRESSE_PLUS_DEFINIE); /* Liberation du vecteur contenant la derivee seconde. */ /* */ /* Le 'ADRESSE_PLUS_DEFINIE' a ete introduit le 20050221170441... */ RETU_ERROR; Eblock #undef DELTA_VECTEUR #undef PREMIER_ELEMENT_DE_LA_FONCTION EFonctionI _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A P P R O X I M A T I O N D ' U N E F O N C T I O N E C H A N T I L L O N E E */ /* P A R U N E S E R I E D E P O L Y N O M E S D E D E G R E 3 S E R A C C O R D A N T : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define PREMIER_ELEMENT_DE_LA_FONCTION \ INDEX0 \ /* Premier element des vecteurs de definition de la fonction et des vecteurs */ \ /* des coefficients d'approximation. */ #define DELTA_VECTEUR(vecteur,indice2,indice1) \ SOUS(ITb0(vecteur,INDX(indice2,PREMIER_ELEMENT_DE_LA_FONCTION)) \ ,ITb0(vecteur,INDX(indice1,PREMIER_ELEMENT_DE_LA_FONCTION)) \ ) \ /* Calcul d'un accroissement sur un 'vecteur' d'un indice (1) a un autre (2). */ DEFV(Common,DEFV(FonctionI,Fapproximation_par_des_polynomes_cubiques(coefficients_de_degre_0 ,coefficients_de_degre_1 ,coefficients_de_degre_2 ,coefficients_de_degre_3 ,liste_des_abscisses ,liste_des_ordonnees ,liste_des_derivees_premieres ,nombre_d_echantillons ) ) ) DEFV(Argument,DEFV(Float,DTb0(coefficients_de_degre_0))); DEFV(Argument,DEFV(Float,DTb0(coefficients_de_degre_1))); DEFV(Argument,DEFV(Float,DTb0(coefficients_de_degre_2))); DEFV(Argument,DEFV(Float,DTb0(coefficients_de_degre_3))); /* Vecteurs donnant au retour les coeficients respectifs des quatre puissances */ /* de la variable 'X' (a savoir 0, 1, 2 et 3). Mais ATTENTION, il est renvoye ainsi */ /* un point de moins que la fonction n'en contient... */ DEFV(Argument,DEFV(Float,DTb0(liste_des_abscisses))); DEFV(Argument,DEFV(Float,DTb0(liste_des_ordonnees))); /* Vecteurs contenant a l'entree la definition en {X,Y} de la fonction echantillonnee. Mais */ /* ils contiennent un point de plus que n'en contiennent au retour les coefficients */ /* ci-dessus... */ DEFV(Argument,DEFV(Float,DTb0(liste_des_derivees_premieres))); /* Definition des derivees premieres en chacun des points echantillonnes. */ DEFV(Argument,DEFV(Positive,nombre_d_echantillons)); /* Nombre d'echantillons definissant la fonction argument en {X,Y}, c'est donc la dimension */ /* des vecteurs 'liste_des_abscisses' et 'liste_des_ordonnees', mais c'est la dimension */ /* plus 1 des quatre vecteurs de coefficients renvoyes au 'RETU'... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(Int,INIT(index,UNDEF)); /* Definition de l'index d'iteration. */ /*..............................................................................................................................*/ DoIn(index ,PREMIER_ELEMENT_DE_LA_FONCTION ,PRED(LSTX(PREMIER_ELEMENT_DE_LA_FONCTION,nombre_d_echantillons)) ,PasX ) Bblock EGAL(ITb1(coefficients_de_degre_0,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,ITb0(liste_des_ordonnees,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ); /* */ /* C = Y(i) */ /* 0,i */ /* */ EGAL(ITb1(coefficients_de_degre_1,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,ITb0(liste_des_derivees_premieres,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ); /* */ /* dY */ /* C = ----(i) */ /* 1,i dX */ /* */ EGAL(ITb1(coefficients_de_degre_3,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,DIVI(SOUS(ADD2(ITb0(liste_des_derivees_premieres,INDX(NEUT(index),PREMIER_ELEMENT_DE_LA_FONCTION)) ,ITb0(liste_des_derivees_premieres,INDX(SUCC(index),PREMIER_ELEMENT_DE_LA_FONCTION)) ) ,DOUB(DIVI(DELTA_VECTEUR(liste_des_ordonnees,SUCC(index),NEUT(index)) ,DELTA_VECTEUR(liste_des_abscisses,SUCC(index),NEUT(index)) ) ) ) ,EXP2(DELTA_VECTEUR(liste_des_abscisses,SUCC(index),NEUT(index))) ) ); /* */ /* dY dY Y(i+1) - Y(i) */ /* ----(i) + ----(i+1) - 2.--------------- */ /* dX dX X(i+1) - X(i) */ /* C = ----------------------------------------- */ /* 3,i 2 */ /* [X(i+1) - X(i)] */ /* */ EGAL(ITb1(coefficients_de_degre_2,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,DIVI(SOUS(DELTA_VECTEUR(liste_des_ordonnees,SUCC(index),NEUT(index)) ,MUL2(DELTA_VECTEUR(liste_des_abscisses,SUCC(index),NEUT(index)) ,ADD2(ITb1(coefficients_de_degre_1,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ,MUL2(EXP2(DELTA_VECTEUR(liste_des_abscisses,SUCC(index),NEUT(index))) ,ITb1(coefficients_de_degre_3,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION)) ) ) ) ) ,EXP2(DELTA_VECTEUR(liste_des_abscisses,SUCC(index),NEUT(index))) ) ); /* */ /* 2 */ /* [Y(i+1) - Y(i)] - [X(i+1) - X(i)].{C + C .[X(i+1) - X(i)] } */ /* 1,i 3,i */ /* C = ----------------------------------------------------------------- */ /* 2,i 2 */ /* [X(i+1) - X(i)] */ /* */ Eblock EDoI RETU_ERROR; Eblock #undef DELTA_VECTEUR #undef PREMIER_ELEMENT_DE_LA_FONCTION EFonctionI _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E " D E M I - S O M M E / D E M I - D I F F E R E N C E " */ /* M O N O - D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ #define PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE \ INDEX0 \ /* Premier element du vecteur definissant sa transformee. */ BFonctionI #define MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE \ MOIT(nombre_de_points_de_la_fonction_et_de_sa_transformee) \ /* La dichotomie de la transformee "somme-difference" se fait en diminuant de moitie */ \ /* le nombre d'elements de la definition, ce qui double la periode a chaque etape... */ #define PAS_DES_ITERATIONS_DE_DEMI_SOMME_ET_DEMI_DIFFERENCE \ TRMU(TRPU(nombre_de_points_a_la_fin_de_la_recursivite)) \ /* Pas a utiliser pour balayer les vecteurs definissant la fonction et ses transformees. */ #define DEFINITION_DES_INDEX_GAUCHE_ET_DROITE \ DEFV(Int,INIT(index_gauche \ ,ADD2(NEUT(DOUB(SOUS(coordonnee_spatiale,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE))) \ ,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE \ ) \ ) \ ); \ DEFV(Int,INIT(index_droite \ ,ADD2(ADD2(DOUB(SOUS(coordonnee_spatiale,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE)) \ ,PAS_DES_ITERATIONS_DE_DEMI_SOMME_ET_DEMI_DIFFERENCE \ ) \ ,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE \ ) \ ) \ ); #define DEFINITION_DES_INDEX_DEMI_SOMME_ET_DEMI_DIFFERENCE \ DEFV(Int,INIT(index______demi_somme \ ,NEUT(coordonnee_spatiale) \ ) \ ); \ DEFV(Int,INIT(index_demi_difference \ ,ADD2(coordonnee_spatiale,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE) \ ) \ ); #define FONCTION_ET_SA_TRANSFORMEE(index) \ ITb0(fonction_et_sa_transformee \ ,INDX(index,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE) \ ) #define DEMI_SOMME______DES_VALEURS(coordonnee) \ IdTb1(demi_somme______des_valeurs \ ,INDX(coordonnee,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE) \ ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE \ ) #define DEMI_DIFFERENCE_DES_VALEURS(coordonnee) \ IdTb1(demi_difference_des_valeurs \ ,INDX(coordonnee,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE) \ ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE \ ) /* Acces aux differentes structures... */ DEFV(Common,DEFV(Float,SINT(IFsomme_difference_1D_____seuil_de_filtrage_des_demi_sommes______de_la_transformee_inverse,FZERO))); DEFV(Common,DEFV(Float,SINT(IFsomme_difference_1D_____seuil_de_filtrage_des_demi_differences_de_la_transformee_inverse,FZERO))); /* Parametres introduits le 20030327120555 et qui permettent de supprimer les petits */ /* coefficients (en valeur absolue) lors de la transformee inverse... */ /* */ /* ATTENTION : ces seuils sont en general dans [0,1] et non point dans [$NOIR,$BLANC]... */ DEFV(Local,DEFV(FonctionI,IFsomme_difference_1D(fonction_et_sa_transformee ,nombre_de_points_de_la_fonction_et_de_sa_transformee ,nombre_de_points_a_la_fin_de_la_recursivite ,calcul_de_la_transformee_directe ) ) ) /* Fonction introduite le 20030324115446. */ DEFV(Argument,DEFV(Float,DTb0(fonction_et_sa_transformee))); /* Vecteur contenant a la fois la fonction et sa transformee "somme-difference". */ DEFV(Argument,DEFV(Positive,nombre_de_points_de_la_fonction_et_de_sa_transformee)); /* Dimension du vecteur contenant la transformee de la fonction. */ DEFV(Argument,DEFV(Positive,nombre_de_points_a_la_fin_de_la_recursivite)); /* Dimension limite correspondant a la fin de la recursivite (en general */ /* vaudra 'UNITE'). */ DEFV(Argument,DEFV(Logical,calcul_de_la_transformee_directe)); /* Cet indicateur precise si l'on calcule la transformee directe ('VRAI'), */ /* ou inverse ('FAUX'). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(Int,INIT(frequence_spatiale,UNDEF)); /* Definition de la frequence spatiale 'u' courante. */ /*..............................................................................................................................*/ Test(IFLT(nombre_de_points_de_la_fonction_et_de_sa_transformee,nombre_de_points_a_la_fin_de_la_recursivite)) Bblock PRINT_ERREUR("la definition de la fonction est mauvaise"); /* Ou bien, le nombre de points initial est negatif ou nul, ou bien, la */ /* fin de la recursivite n'est pas une puissance de 2... */ CODE_ERROR(ERREUR15); Eblock ATes Bblock Test(IFEQ(nombre_de_points_de_la_fonction_et_de_sa_transformee,nombre_de_points_a_la_fin_de_la_recursivite)) Bblock /* C'est fini... */ Eblock ATes Bblock /* Cas, ou la recursivite doit se poursuivre... */ DEFV(Int,INIT(coordonnee_spatiale,UNDEF)); /* Index permettant de calculer les moyennes et les differences... */ DEFV(Float,DdTb1(POINTERf ,demi_somme______des_valeurs ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,fMalo(MUL2(MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE,size_Float)) ) ); DEFV(Float,DdTb1(POINTERf ,demi_difference_des_valeurs ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,fMalo(MUL2(MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE,size_Float)) ) ); /* Allocation des vecteurs contenant respectivement la moyenne et la difference des valeurs. */ Test(IFNE(DOUB(MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE) ,nombre_de_points_de_la_fonction_et_de_sa_transformee ) ) Bblock PRINT_ERREUR("la dimension des lignes et/ou des colonnes n'est pas une puissance de 2"); Eblock ATes Bblock Eblock ETes Test(IL_FAUT(calcul_de_la_transformee_directe)) Bblock /* Calcul de la transformee directe : */ DoIn(coordonnee_spatiale ,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,LSTX(PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ) ,PAS_DES_ITERATIONS_DE_DEMI_SOMME_ET_DEMI_DIFFERENCE ) Bblock DEFINITION_DES_INDEX_GAUCHE_ET_DROITE; EGAL(DEMI_SOMME______DES_VALEURS(coordonnee_spatiale) ,MOYE(FONCTION_ET_SA_TRANSFORMEE(index_gauche) ,FONCTION_ET_SA_TRANSFORMEE(index_droite) ) ); EGAL(DEMI_DIFFERENCE_DES_VALEURS(coordonnee_spatiale) ,SOYE(FONCTION_ET_SA_TRANSFORMEE(index_gauche) ,FONCTION_ET_SA_TRANSFORMEE(index_droite) ) ); /* Calcul de la moyenne et de la difference des elements de la fonction. */ /* */ /* Soient 'G' (pour "Gauche") et 'D' (pour "Droite") deux elements successifs de la */ /* fonction. On a alors : */ /* */ /* G + D */ /* m = ------- */ /* 2 */ /* */ /* G - D */ /* d = ------- */ /* 2 */ /* */ /* 'm' et 'd' designant respectivement "demi-somme" et "demi-difference" (en fait */ /* "Moyenne" et "Difference" historiquement). On notera immediatement (ce qui sera */ /* utilise dans la transformee inverse) que : */ /* */ /* G = m + d */ /* D = m - d */ /* */ /* Le principe de cette transformee "somme-difference" est donc le suivant. Soit un */ /* vecteur V (qui sera ulterieurement une ligne ou une colonne d'image) : */ /* */ /* ------------------------------------------------- */ /* V : | G1 | D1 | G2 | D2 | G3 | D3 | ... | GN | DN | */ /* ------------------------------------------------- */ /* */ /* materialisons les couples {G(i),D(i)} (par un caractere ":") : */ /* */ /* ------------------------------------------------- */ /* V : | G1 : D1 | G2 : D2 | G3 : D3 | ... | GN : DN | */ /* ------------------------------------------------- */ /* */ /* Pour chaque couple {G,D} d'elements de ce vecteur, on calcule {m,d} et le vecteur V */ /* est reecrit : */ /* */ /* ------------------------------------------------- */ /* V : | m1 : m2 | m3 : .. : mN | d1 : d2 | d3 : .. : dN | */ /* ------------------------------------------------- */ /* \ / */ /* \________ V' ________/ */ /* */ /* */ /* */ /* ou ainsi toutes les moyennes 'm(i)' sont mises a gauche et toutes les difference 'd(i)' */ /* a droite. */ /* */ /* La procedure precedente est repetee recursivement sur le vecteur V' (qui est donc de */ /* longueur moitie de celle de V) jusqu'a un vecteur de longueur unite... */ /* */ /* Une image sera alors traitee en deux passes : une premiere concernant les lignes et une */ /* seconde concernant les colonnes... */ Eblock EDoI DoIn(coordonnee_spatiale ,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,LSTX(PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ) ,PAS_DES_ITERATIONS_DE_DEMI_SOMME_ET_DEMI_DIFFERENCE ) Bblock DEFINITION_DES_INDEX_DEMI_SOMME_ET_DEMI_DIFFERENCE; EGAL(FONCTION_ET_SA_TRANSFORMEE(index______demi_somme) ,DEMI_SOMME______DES_VALEURS(coordonnee_spatiale) ); EGAL(FONCTION_ET_SA_TRANSFORMEE(index_demi_difference) ,DEMI_DIFFERENCE_DES_VALEURS(coordonnee_spatiale) ); Eblock EDoI Eblock ATes Bblock Eblock ETes CALS(IFsomme_difference_1D(fonction_et_sa_transformee ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,nombre_de_points_a_la_fin_de_la_recursivite ,calcul_de_la_transformee_directe ) ); /* Calcul de la transformee "somme-difference" de la fonction argument. */ Test(IL_FAUT(calcul_de_la_transformee_directe)) Bblock Eblock ATes Bblock /* Calcul de la transformee inverse : */ DoIn(coordonnee_spatiale ,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,LSTX(PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ) ,PAS_DES_ITERATIONS_DE_DEMI_SOMME_ET_DEMI_DIFFERENCE ) Bblock DEFINITION_DES_INDEX_DEMI_SOMME_ET_DEMI_DIFFERENCE; DEFV(Float,INIT(demi_somme_____,FLOT__UNDEF)); DEFV(Float,INIT(demi_difference,FLOT__UNDEF)); EGAL(demi_somme_____,FONCTION_ET_SA_TRANSFORMEE(index______demi_somme)); EGAL(demi_difference,FONCTION_ET_SA_TRANSFORMEE(index_demi_difference)); /* Moyenne et difference courantes... */ EGAL(DEMI_SOMME______DES_VALEURS(coordonnee_spatiale) ,COND(IFGE(ABSO(demi_somme_____) ,IFsomme_difference_1D_____seuil_de_filtrage_des_demi_sommes______de_la_transformee_inverse ) ,demi_somme_____ ,FZERO ) ); EGAL(DEMI_DIFFERENCE_DES_VALEURS(coordonnee_spatiale) ,COND(IFGE(ABSO(demi_difference) ,IFsomme_difference_1D_____seuil_de_filtrage_des_demi_differences_de_la_transformee_inverse ) ,demi_difference ,FZERO ) ); /* Filtrage eventuel de la moyenne et de la difference courantes... */ /* */ /* ATTENTION : ces seuils sont en general dans [0,1] et non point dans [$NOIR,$BLANC]... */ Eblock EDoI DoIn(coordonnee_spatiale ,PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,LSTX(PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE ) ,PAS_DES_ITERATIONS_DE_DEMI_SOMME_ET_DEMI_DIFFERENCE ) Bblock DEFINITION_DES_INDEX_GAUCHE_ET_DROITE; EGAL(FONCTION_ET_SA_TRANSFORMEE(index_gauche) ,ADD2(DEMI_SOMME______DES_VALEURS(coordonnee_spatiale) ,DEMI_DIFFERENCE_DES_VALEURS(coordonnee_spatiale) ) ); EGAL(FONCTION_ET_SA_TRANSFORMEE(index_droite) ,SOUS(DEMI_SOMME______DES_VALEURS(coordonnee_spatiale) ,DEMI_DIFFERENCE_DES_VALEURS(coordonnee_spatiale) ) ); /* Calcul des elements de la fonction a partir de leurs moyennes et de leur differences. */ Eblock EDoI Eblock ETes FdTb1(demi_difference_des_valeurs ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE,Float,ADRESSE_PLUS_DEFINIE ); FdTb1(demi_somme______des_valeurs ,MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE,Float,ADRESSE_PLUS_DEFINIE ); /* Allocation des vecteurs contenant respectivement la moyenne et la difference des valeurs. */ /* */ /* Les 'ADRESSE_PLUS_DEFINIE's ont ete introduits le 20050221170441... */ Eblock ETes Eblock ETes RETU_ERROR; Eblock #undef DEMI_DIFFERENCE_DES_VALEURS #undef DEMI_SOMME______DES_VALEURS #undef FONCTION_ET_SA_TRANSFORMEE #undef DEFINITION_DES_INDEX_DEMI_SOMME_ET_DEMI_DIFFERENCE #undef DEFINITION_DES_INDEX_GAUCHE_ET_DROITE #undef PAS_DES_ITERATIONS_DE_DEMI_SOMME_ET_DEMI_DIFFERENCE #undef MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M E E " D E M I - S O M M E / D E M I - D I F F E R E N C E " */ /* B I - D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(Positive,SINT(IFsomme_difference_2D_____nombre_de_points_a_la_fin_de_la_recursivite__horizontale,ZERO))); DEFV(Common,DEFV(Positive,SINT(IFsomme_difference_2D_____nombre_de_points_a_la_fin_de_la_recursivite__verticale,ZERO))); /* Permet de generer des images suivant la methode anterieure au 20151209131512 en ce qui */ /* concerne le nombre de points a la fin de la recursivite... */ /* */ /* Je note le 20151209133751 que cela ne semble pas tres interessant, mais malgre tout, */ /* je conserve ce dispositif. Que voit-on si il est utilise ? Par exemple si on prend */ /* 64 points l'horizontale et a la verticale, la transformee de l'image Argument */ /* ('calcul_de_la_transformee_directe') est identique a l'image Argument ('imageA') sauf */ /* sur une grille 64x64 sur laquelle on trouve les 'log2(1024/64) = 4' premieres etapes */ /* de la transformation (au passage, le 1024 precedent vient de l'hypothese que l'on est */ /* en mode 'Sdu'...). */ DEFV(Common,DEFV(FonctionF,POINTERp(IFsomme_difference_2D(transformee_de_l_imageA ,imageA ,calcul_de_la_transformee_directe ) ) ) ) /* Fonction introduite le 20030324115446. */ DEFV(Argument,DEFV(imageF,transformee_de_l_imageA)); /* Image transformee de "somme-difference" de l'image Argument. */ DEFV(Argument,DEFV(imageF,imageA)); /* Image Argument. */ DEFV(Argument,DEFV(Logical,calcul_de_la_transformee_directe)); /* Cet indicateur precise si l'on calcule la transformee directe ('VRAI'), */ /* ou inverse ('FAUX'). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BDEFV(ligneF,ligne_courante_et_sa_transformee); /* Ligne courante et sa transformee "somme-difference"... */ BDEFV(colonneF,colonne_courante_et_sa_transformee); /* Colonne courante et sa transformee "somme-difference"... */ /*..............................................................................................................................*/ Test(IFNE(PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE,PAR0(PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE))) Bblock PRINT_ERREUR("le premier element d'un vecteur doit avoir un rang pair"); Eblock ATes Bblock Eblock ETes Test(IFOU(IFNE(PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE,Xmin) ,IFNE(PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE,Ymin) ) ) Bblock PRINT_ERREUR("les definitions sont incompatibles avec la methode"); Eblock ATes Bblock Eblock ETes Test(IFOU(IZNE(REST(dimX,pasX)) ,IZNE(REST(dimY,pasY)) ) ) Bblock PRINT_ERREUR("les pas 'pasX' et 'pasY' doivent etre aussi des puissances de 2"); /* En fait, la verification que 'dimX' et 'dimY' sont aussi des puissances */ /* de 2 n'est faite que lors de la dichotomie recursive (pour des raisons */ /* de simplicite...). */ Eblock ATes Bblock Eblock ETes begin_colonne Bblock /* On transforme d'abord horizontalement : */ /* */ /* Y ^ */ /* | ---------------- */ /* | ---------------- */ /* | ---------------- */ /* | ---------------- */ /* | ---------------- */ /* -|--------------------> */ /* X */ /* */ /* (ligne apres ligne). */ begin_ligne Bblock EGAL(LIGNE(ligne_courante_et_sa_transformee,X,Y) ,loadF_point(imageA,X,Y) ); /* Recuperation de la ligne courante dans 'imageA' (c'est-a-dire */ /* l'image Argument), */ Eblock end_ligne CALS(IFsomme_difference_1D(ligne_courante_et_sa_transformee ,dimX ,MAX2(IFsomme_difference_2D_____nombre_de_points_a_la_fin_de_la_recursivite__horizontale ,TRMU(TRPU(pasX)) ) ,calcul_de_la_transformee_directe ) ); /* Et transformation "somme-difference" mono-dimensionnelle de la ligne courante... */ begin_ligne Bblock storeF_point(LIGNE(ligne_courante_et_sa_transformee,X,Y) ,transformee_de_l_imageA ,X,Y ); /* Generation de la transformee "somme-difference" bi-dimensionnelle, ligne apres ligne... */ Eblock end_ligne Eblock end_colonne begin_ligne Bblock /* Puis, on transforme verticalement : */ /* */ /* Y ^ */ /* | | | | | | | | | */ /* | | | | | | | | | */ /* | | | | | | | | | */ /* | | | | | | | | | */ /* | | | | | | | | | */ /* -|--------------------> */ /* X */ /* */ /* (colonne apres colonne). */ begin_colonne Bblock EGAL(COLONNE(colonne_courante_et_sa_transformee,X,Y) ,loadF_point(transformee_de_l_imageA,X,Y) ); /* Recuperation de la colonne courante dans 'transformee_de_l_imageA' */ /* (c'est-a-dire la transformee "horizontale" de 'imageA'). */ Eblock end_colonne CALS(IFsomme_difference_1D(colonne_courante_et_sa_transformee ,dimY ,MAX2(IFsomme_difference_2D_____nombre_de_points_a_la_fin_de_la_recursivite__verticale ,TRMU(TRPU(pasY)) ) ,calcul_de_la_transformee_directe ) ); /* Et transformation "somme-difference" mono-dimensionnelle de la colonne courante... */ begin_colonne Bblock storeF_point(COLONNE(colonne_courante_et_sa_transformee,X,Y) ,transformee_de_l_imageA ,X,Y ); /* Generation de la transformee de "somme-difference" bi-dimensionnelle, colonne */ /* apres colonne... */ Eblock end_colonne Eblock end_ligne EDEFV(colonneF,colonne_courante_et_sa_transformee); /* Colonne courante et sa transformee "somme-difference"... */ EDEFV(ligneF,ligne_courante_et_sa_transformee); /* Ligne courante et sa transformee "somme-difference"... */ RETIF(transformee_de_l_imageA); Eblock EFonctionF #undef PREMIER_ELEMENT_DE_LA_FONCTION_ET_DE_SA_TRANSFORMEE _______________________________________________________________________________________________________________________________________