/*************************************************************************************************************************************/ /* */ /* 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 definitions 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 : */ /* */ /* */ /* n=Xmax */ /* ___ */ /* \ 1 n-b */ /* T(f,(b,a)) = / ---.g(-----).f(n) ou 'b' est le parametre de position et 'a' le parametre d'echelle. */ /* --- a a */ /* n=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$DEF' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 19890000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define EPSILON_DE_L_ONDELETTE \ SIX \ /* Moins le logarithme neperien de la valeur a partir de laquelle on considere */ \ /* qu'une exponentielle est nulle : */ \ /* */ \ /* -6 */ \ /* e = 0. */ \ /* */ #define FREQUENCE_DE_L_ONDELETTE \ CERCLE_TRIGONOMETRIQUE \ /* Valeur initiale (et implicite) des frequences reelle et imaginaire de l'ondelette */ \ /* de Morlet. */ #define INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D \ NEGA(INTE(DIVI(RACA(DOUB(EPSILON_DE_L_ONDELETTE)) \ ,DIVI(CERCLE_TRIGONOMETRIQUE,MUL2(NOMBRE_DE_POINTS_PAR_CYCLE,FREQUENCE_DE_L_ONDELETTE)) \ ) \ ) \ ) \ /* Definition de la valeur inferieure de l'index 'j', soit 'nL'. */ #define CENTRE_DE_L_ONDELETTE_1D \ MOYE(INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,INDEX_DE_DROITE_DE_L_ONDELETTE_1D) \ /* Definition du "centre" de l'ondelette. */ #define INDEX_DE_DROITE_DE_L_ONDELETTE_1D \ TRMU(NEGA(INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D)) \ /* Definition de la valeur superieure de l'index 'j', soit 'nR'. */ #define k___LONGUEUR_DE_L_ONDELETTE_1D \ LENG(INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,INDEX_DE_DROITE_DE_L_ONDELETTE_1D) \ /* Definition du nombre de noeuds definissant l'ondelette. */ \ /* */ \ /* ATTENTION : la constante 'LONGUEUR_DE_L_ONDELETTE_1D' est pre-generee dans */ \ /* '$xcp/Konstantes$K'. */ #define ACCES_A_L_ONDELETTE_1D(coefficient,x,y) \ ITb1(coefficient,INDX(x,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D)) \ /* Primitive d'acces a l'element 'x' d'un certain coefficient de l'ondelette. */ #define VALEUR_DE_L_ONDELETTE_1D(coefficient,x,y,facteur_d_echelle) \ DIVI(ACCES_A_L_ONDELETTE_1D(coefficient,x,y) \ ,facteur_d_echelle \ ) \ /* Primitive donnant la valeur de l'element 'x' d'un certain coefficient de l'ondelette. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef LONGUEUR_DE_L_ONDELETTE_1D \ k___LONGUEUR_DE_L_ONDELETTE_1D \ /* Cette astucieuse solution permet de resoudre le probleme des dimensions de tableaux */ \ /* obtenues a partir de nombres flottants (par exemple 'PI'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' O N D E L E T T E B I - D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ #define INDEX_DE_GAUCHE_DE_L_ONDELETTE_2D \ NEGA(DEUX) \ /* Definition de la valeur inferieure de l'index horizontal, */ #define INDEX_DE_DROITE_DE_L_ONDELETTE_2D \ NEUT(DEUX) \ /* Definition de la valeur superieure de l'index horizontal. */ #define INDEX_DU_BAS_DE_L_ONDELETTE_2D \ NEGA(DEUX) \ /* Definition de la valeur inferieure de l'index vertical, */ #define INDEX_DU_HAUT_DE_L_ONDELETTE_2D \ NEUT(DEUX) \ /* Definition de la valeur superieure de l'index vertical. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E L ' O N D E L E T T E C O U R A N T E : */ /* */ /*************************************************************************************************************************************/ #define NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D \ SUCC(LONGUEUR_DE_L_ONDELETTE_1D) \ /* Nombre de points pour definir l'ondelette que l'on veut approximer ; */ \ /* notera qu'il y a un point de plus que dans l'ondelette, en effet, le calcul des */ \ /* coefficients 'C' au point 'X' se fait principalement par des differences du type : */ \ /* */ \ /* C(X) = f(X+1) - f(X) */ \ /* */ \ /* d'ou le '+1'... */ \ /* */ \ /* L'approximation se fait soit par un spline cubique soit par une famille de polynomes */ \ /* du troisieme degre. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A P P R O X I M A T I O N D E L ' O N D E L E T T E C O U R A N T E */ /* P A R U N S P L I N E C U B I Q U E : */ /* */ /*************************************************************************************************************************************/ #define VALEUR_DE_LA_FONCTION_AUX_EXTREMITES \ FZERO \ /* Valeur de la fonction aux extremites gauche et droite de l'intervalle de calcul. */ #define VALEUR_DE_LA_DERIVEE_PREMIERE_AUX_EXTREMITES \ FZERO \ /* Valeur de la derivee premiere de la fonction aux extremites gauche et droite */ \ /* de l'intervalle de calcul. */ #define GENERATION_DE_L_ONDELETTE_1D_PAR_SPLINE(fonction,derivee_de_la_fonction) \ /* Generation de l'ondelette par echantillonnage de la fonction argument 'fonction' et */ \ /* par approximation par un spline cubique mono-dimensionnel ; ATTENTION : l'argument */ \ /* 'derivee_de_la_fonction' est la par symetrie avec l'approximation par les polynomes */ \ /* cubiques... */ \ Bblock \ DEFV(Float,DTb1(liste_des_abscisses,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D)); \ DEFV(Float,DTb1(liste_des_ordonnees,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D)); \ /* Echantillons de l'ondelette donnes par des couples (abscisses,ordonnees). */ \ begin_ligneQ(DoIn \ ,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D \ ,LSTX(INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D) \ ,PasX \ ) \ Bblock \ /* Initialisation et echantillonnage de l'ondelette que l'on veut approximer par le spline. */ \ EGAL(ITb1(liste_des_abscisses,INDX(X,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D)),X); \ Test(IFOU(IFEQ(X \ ,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D \ ) \ ,IFEQ(X \ ,LSTX(INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D \ ,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D \ ) \ ) \ ) \ ) \ Bblock \ EGAL(ITb1(liste_des_ordonnees,INDX(X,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D)) \ ,VALEUR_DE_LA_FONCTION_AUX_EXTREMITES \ ); \ Eblock \ ATes \ Bblock \ EGAL(ITb1(liste_des_ordonnees,INDX(X,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D)) \ ,fonction(X) \ ); \ Eblock \ ETes \ Eblock \ end_ligneQ(EDoI) \ \ CALS(Fapproximation_par_un_spline_cubique(Fondelettes_1D_____coefficient_X0_de_l_ondelette \ ,Fondelettes_1D_____coefficient_X1_de_l_ondelette \ ,Fondelettes_1D_____coefficient_X2_de_l_ondelette \ ,Fondelettes_1D_____coefficient_X3_de_l_ondelette \ ,liste_des_abscisses \ ,liste_des_ordonnees \ ,VALEUR_DE_LA_DERIVEE_PREMIERE_AUX_EXTREMITES \ ,VALEUR_DE_LA_DERIVEE_PREMIERE_AUX_EXTREMITES \ ,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D \ ) \ ); \ /* Approximation de l'ondelette par un spline cubique mono-dimensionnel ; la premiere */ \ /* derivee premiere, ainsi que la derniere sont prises nulles ('FZERO'). */ \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A P P R O X I M A T I O N D E L ' O N D E L E T T E C O U R A N T E */ /* P A R D E S P O L Y N O M E S D E D E G R E T R O I S : */ /* */ /*************************************************************************************************************************************/ #define GENERATION_DE_L_ONDELETTE_1D_PAR_POLYNOMES(fonction,derivee_de_la_fonction) \ /* Generation de l'ondelette par echantillonnage de la fonction argument 'fonction' et */ \ /* par approximation par des polynomes du troisieme degre. */ \ Bblock \ DEFV(Float,DTb1(liste_des_abscisses,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D)); \ DEFV(Float,DTb1(liste_des_ordonnees,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D)); \ DEFV(Float,DTb1(liste_des_derivees_premieres,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D)); \ /* Echantillons de l'ondelette donnes par des triplets (abscisses,ordonnees,derivees). */ \ begin_ligneQ(DoIn \ ,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D \ ,LSTX(INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D) \ ,PasX \ ) \ Bblock \ /* Initialisation et echantillonnage de l'ondelette que l'on veut approximer par le spline. */ \ EGAL(ITb1(liste_des_abscisses,INDX(X,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D)),X); \ EGAL(ITb1(liste_des_ordonnees,INDX(X,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D)) \ ,fonction(X) \ ); \ EGAL(ITb1(liste_des_derivees_premieres,INDX(X,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D)) \ ,derivee_de_la_fonction(X) \ ); \ Eblock \ end_ligneQ(EDoI) \ \ CALS(Fapproximation_par_des_polynomes_cubiques(Fondelettes_1D_____coefficient_X0_de_l_ondelette \ ,Fondelettes_1D_____coefficient_X1_de_l_ondelette \ ,Fondelettes_1D_____coefficient_X2_de_l_ondelette \ ,Fondelettes_1D_____coefficient_X3_de_l_ondelette \ ,liste_des_abscisses \ ,liste_des_ordonnees \ ,liste_des_derivees_premieres \ ,NOMBRE_DE_POINTS_DE_LA_FONCTION_DEFINISSANT_L_ONDELETTE_1D \ ) \ ); \ /* Approximation de l'ondelette par des polynomes du trosieme degre. */ \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E D I T I O N D E L ' O N D E L E T T E C O U R A N T E : */ /* */ /*************************************************************************************************************************************/ #define PRINT_ONDELETTE_1D \ /* Impression de l'ondelette courante. */ \ Bblock \ CAL2(Prin0("\n\n")); \ CAL2(Prin0("Ondelette courante :\n")); \ \ begin_ligneQ(DoIn,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,INDEX_DE_DROITE_DE_L_ONDELETTE_1D,PasX) \ Bblock \ CAL2(Prin8("C0(%d)=%g C1(%d)=%g C2(%d)=%g C3(%d)=%g\n" \ ,X,ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X0_de_l_ondelette,X,Ymin) \ ,X,ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X1_de_l_ondelette,X,Ymin) \ ,X,ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X2_de_l_ondelette,X,Ymin) \ ,X,ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X3_de_l_ondelette,X,Ymin) \ ) \ ); \ Eblock \ end_ligneQ(EDoI) \ CAL2(Prin0("\n")); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' O N D E L E T T E " C R E N E A U " : */ /* */ /* */ /* Definition : */ /* */ /* L'ondelette "creneau" est definie */ /* en complexe par : */ /* */ /* delta(X,Xcentre) + i.delta(X,Xcentre) */ /* */ /* ou 'Xcentre' designe le "centre de */ /* l'ondelette. */ /* */ /* */ /*************************************************************************************************************************************/ #define ONDELETTE_CRENEAU_1D \ /* Generation de l'ondelette "creneau"... */ \ /* a referencer directement si besoin dans : */ \ /* */ \ /* GENERATION_DE_LA_PARTIE_REELLE_DE_L_ONDELETTE_1D, */ \ /* */ \ /* et : */ \ /* */ \ /* GENERATION_DE_LA_PARTIE_IMAGINAIRE_DE_L_ONDELETTE_1D. */ \ /* */ \ Bblock \ begin_ligneQ(DoIn,INDEX_DE_GAUCHE_DE_L_ONDELETTE_1D,INDEX_DE_DROITE_DE_L_ONDELETTE_1D,PasX) \ Bblock \ EGAL(ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X0_de_l_ondelette,X,Ymin),FZERO); \ EGAL(ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X1_de_l_ondelette,X,Ymin),FZERO); \ EGAL(ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X2_de_l_ondelette,X,Ymin),FZERO); \ EGAL(ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X3_de_l_ondelette,X,Ymin),FZERO); \ Eblock \ end_ligneQ(EDoI) \ \ EGAL(ACCES_A_L_ONDELETTE_1D(Fondelettes_1D_____coefficient_X0_de_l_ondelette,CENTRE_DE_L_ONDELETTE_1D,Ymin),FU); \ /* Tous les coefficients sont nuls, sauf le coefficient lineaire ('X0') au "centre"... */ \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /* */ /* 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 ONDELETTE_1D_DE_MORLET(variable,frequence,fonction) \ MUL2(EXPB(NEGA(MOIT(EXP2(variable)))),fonction(MUL2(frequence,variable))) \ /* Definition generale de l'ondelette de Morlet. */ \ /* */ \ /* On notera que l'on utilise 'EXPB(...)' et non pas 'EXPX(...)' a cause du bug */ \ /* 'BUG_SYSTEME_SG_C_exp'... */ #define ONDELETTE_1D_DE_MORLET_PARTIE_REELLE(variable) \ ONDELETTE_1D_DE_MORLET(variable,Fondelettes_1D_____frequence_reelle,COSD) \ /* Definition de la partie reelle de l'ondelette de Morlet, */ #define ONDELETTE_1D_DE_MORLET_PARTIE_IMAGINAIRE(variable) \ ONDELETTE_1D_DE_MORLET(variable,Fondelettes_1D_____frequence_imaginaire,SIND) \ /* Definition de la partie imaginaire de l'ondelette de Morlet. */ #define DERIVEE_DE_L_ONDELETTE_1D_DE_MORLET(variable,frequence,fonction1,fonction2,fonction3) \ MUL2(EXPB(NEGA(MOIT(EXP2(variable)))) \ ,SOUS(MUL2(frequence,fonction1(fonction2(MUL2(frequence,variable)))) \ ,MUL2(variable,fonction3(MUL2(frequence,variable))) \ ) \ ) \ /* Definition generale de la derivee de l'ondelette de Morlet. */ \ /* */ \ /* On notera que l'on utilise 'EXPB(...)' et non pas 'EXPX(...)' a cause du bug */ \ /* 'BUG_SYSTEME_SG_C_exp'... */ #define DERIVEE_DE_L_ONDELETTE_1D_DE_MORLET_PARTIE_REELLE(variable) \ DERIVEE_DE_L_ONDELETTE_1D_DE_MORLET(variable,Fondelettes_1D_____frequence_reelle,NEGA,SIND,COSD) \ /* Definition de la derivee de la partie reelle de l'ondelette de Morlet, */ #define DERIVEE_DE_L_ONDELETTE_1D_DE_MORLET_PARTIE_IMAGINAIRE(variable) \ DERIVEE_DE_L_ONDELETTE_1D_DE_MORLET(variable,Fondelettes_1D_____frequence_imaginaire,NEUT,COSD,SIND) \ /* Definition de la derivee de la partie imaginaire de l'ondelette de Morlet. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X D E L ' O N D E L E T T E C O U R A N T E P O U R L A */ /* M E T H O D E U T I L I S A N T D I R E C T E M E N T U N E F O N C T I O N : */ /* */ /*************************************************************************************************************************************/ #nodefine FONCTION_ONDELETTE_1D_VERSION_01 \ /* Approximation de l'ondelette de Morlet par un developpement limite... */ #define FONCTION_ONDELETTE_1D_VERSION_02 \ /* Ondelette de Morlet "parfaite"... */ #ifdef FONCTION_ONDELETTE_1D_VERSION_01 /* ATTENTION : l'utilisation de '__Fpartie_...' au lieu de 'Fpartie_...' est faite pour */ /* simplifier le probleme de la compatibilite avec le CRAY2... */ # define ONDELETTE_1D_REELLE \ __Fpartie_imaginaireA_de_l_ondelette_1D_de_Morlet \ /* Definition d'une ondelette reelle ; on prend une approximation de la partie imaginaire */ \ /* de l'ondelette de Morlet, car en effet elle est symetrique */ \ /* par rapport a 'OY', et que c'est mieux d'etre symetrique... */ # define ONDELETTE_1D_PARTIE_REELLE \ __Fpartie_reelleA_de_l_ondelette_1D_de_Morlet \ /* Definition de la partie reelle de l'ondelette choisie : c'est une approximation */ \ /* de l'ondelette de Morlet par un developpement limite, */ # define ONDELETTE_1D_PARTIE_IMAGINAIRE \ __Fpartie_imaginaireA_de_l_ondelette_1D_de_Morlet \ /* Definition de la partie imaginaire de l'ondelette choisie : c'est une approximation */ \ /* de l'ondelette de Morlet par un developpement limite. */ #Aifdef FONCTION_ONDELETTE_1D_VERSION_01 #Eifdef FONCTION_ONDELETTE_1D_VERSION_01 #ifdef FONCTION_ONDELETTE_1D_VERSION_02 /* ATTENTION : l'utilisation de '__Fpartie_...' au lieu de 'Fpartie_...' est faite pour */ /* simplifier le probleme de la compatibilite avec le CRAY2... */ # define ONDELETTE_1D_REELLE \ __Fpartie_imaginaire_de_l_ondelette_1D_de_Morlet \ /* Definition d'une ondelette reelle ; on prend la partie imaginaire de l'ondelette de */ \ /* Morlet, car en effet elle est symetrique par rapport a 'OY', et que c'est mieux d'etre */ \ /* symetrique... */ # define ONDELETTE_1D_PARTIE_REELLE \ __Fpartie_reelle_de_l_ondelette_1D_de_Morlet \ /* Definition de la partie reelle de l'ondelette choisie, on prend l'ondelette de */ \ /* Morlet, sans aucune approximations... */ # define ONDELETTE_1D_PARTIE_IMAGINAIRE \ __Fpartie_imaginaire_de_l_ondelette_1D_de_Morlet \ /* Definition de la partie imaginaire de l'ondelette choisie, on prend l'ondelette de */ \ /* Morlet, sans aucune approximations... */ #Aifdef FONCTION_ONDELETTE_1D_VERSION_02 #Eifdef FONCTION_ONDELETTE_1D_VERSION_02 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X D E L ' O N D E L E T T E C O U R A N T E P O U R L A */ /* M E T H O D E D ' A P P R O X I M A T I O N P A R M O R C E A U X : */ /* */ /*************************************************************************************************************************************/ #ifdef FONCTION_ONDELETTE_1D_VERSION_01 # nodefine CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_01 \ /* Approximation des ondelettes par des splines cubiques. */ # define CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_02 \ /* Approximation des ondelettes par des polynomes cubiques. */ # ifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_01 # define GENERATION_DE_LA_PARTIE_REELLE_DE_L_ONDELETTE_1D \ GENERATION_DE_L_ONDELETTE_1D_PAR_SPLINE(ONDELETTE_1D_DE_MORLET_PARTIE_REELLE \ ,VIDE \ ) \ /* Definition de la partie reelle de l'ondelette choisie, */ # define GENERATION_DE_LA_PARTIE_IMAGINAIRE_DE_L_ONDELETTE_1D \ GENERATION_DE_L_ONDELETTE_1D_PAR_SPLINE(ONDELETTE_1D_DE_MORLET_PARTIE_IMAGINAIRE \ ,VIDE \ ) \ /* Definition de la partie imaginaire de l'ondelette choisie. */ # Aifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_01 # Eifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_01 # ifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_02 # define GENERATION_DE_LA_PARTIE_REELLE_DE_L_ONDELETTE_1D \ GENERATION_DE_L_ONDELETTE_1D_PAR_POLYNOMES(ONDELETTE_1D_DE_MORLET_PARTIE_REELLE \ ,DERIVEE_DE_L_ONDELETTE_1D_DE_MORLET_PARTIE_REELLE \ ) \ /* Definition de la partie reelle de l'ondelette choisie, */ # define GENERATION_DE_LA_PARTIE_IMAGINAIRE_DE_L_ONDELETTE_1D \ GENERATION_DE_L_ONDELETTE_1D_PAR_POLYNOMES(ONDELETTE_1D_DE_MORLET_PARTIE_IMAGINAIRE \ ,DERIVEE_DE_L_ONDELETTE_1D_DE_MORLET_PARTIE_IMAGINAIRE \ ) \ /* Definition de la partie imaginaire de l'ondelette choisie. */ # Aifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_02 # Eifdef CHOIX_DE_LA_METHODE_D_APPROXIMATION_DE_L_ONDELETTE_VERSION_02 #Aifdef FONCTION_ONDELETTE_1D_VERSION_01 #Eifdef FONCTION_ONDELETTE_1D_VERSION_01 #ifdef FONCTION_ONDELETTE_1D_VERSION_02 # define GENERATION_DE_LA_PARTIE_REELLE_DE_L_ONDELETTE_1D \ VIDE \ /* Definition de la partie reelle de l'ondelette choisie (rien a faire...), */ # define GENERATION_DE_LA_PARTIE_IMAGINAIRE_DE_L_ONDELETTE_1D \ VIDE \ /* Definition de la partie imaginaire de l'ondelette choisie (rien a faire...). */ #Aifdef FONCTION_ONDELETTE_1D_VERSION_02 #Eifdef FONCTION_ONDELETTE_1D_VERSION_02 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X E N T R E U N E T R A N S F O R M E E E N O N D E L E T T E S */ /* A P P R O X I M E E O U " P A R F A I T E " M O N O - D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ #nodefine APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_01 \ /* Approximation des ondelettes par des morceaux de polynomes... */ #define APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_02 \ /* Utilisation des fonctions exactes pour les ondelettes... */ #ifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_01 # define NOMBRE_DE_POINTS_PAR_CYCLE \ HUIT \ /* Nombre de points par cycle pour l'echantillonnage de l'ondelette. */ # define Fondelettes_1D_reelles(fonction,pointeur_de_position_1D,pointeur_d_echelle_1D,initialiser_les_cumuls_S,ondelette) \ Fondelettes_1D_reelles_approximees(fonction \ ,pointeur_de_position_1D \ ,pointeur_d_echelle_1D \ ,initialiser_les_cumuls_S \ ) #Aifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_01 #Eifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_01 #ifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_02 # define NOMBRE_DE_POINTS_PAR_CYCLE \ UN \ /* Nombre de points par cycle pour l'echantillonnage de l'ondelette. */ # define Fondelettes_1D_reelles(fonction,pointeur_de_position_1D,pointeur_d_echelle_1D,initialiser_les_cumuls_S,ondelette) \ Fondelettes_1D_reelles_parfaites(fonction \ ,pointeur_de_position_1D \ ,pointeur_d_echelle_1D \ ,aFONCTION(ondelette) \ ) #Aifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_02 #Eifdef APPROXIMEE_PARFAITE_ONDELETTE_1D_VERSION_02