/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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




Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.