Convolution de 2 tableaux unidimensionnels avec FFTW C++

Convolution de 2 tableaux unidimensionnels avec FFTW C++ - C++ - Programmation

Marsh Posté le 05-10-2011 à 16:49:41    

Bonjour,
 
Je viens tout juste de télécharger la bibliotheque fftw3 et j'ai lu le tutorial.
En fait, mon but est de faire la convolution de deux énormes tableaux de double, et je veux utiliser la transformée de fourrier pour des critères de rapidité.
 
Je sais que pour faire la convolution, il faut suivre cet algorithme ci dessous:
 
Etape 1
TF(A)=FFT(A) avec A un de nos tableaux de départ de taille M
TF(B)=FFT(B) avec B un de nos tableaux de départ de taille N
 
Etape 2
Puis faire TF(A)*TF(B)
 
Etape 3
Et finir par faire l'inversion en obtenant Conv(A,B) = IFFT( TF(A)*TF(B) ) qui aura une taille égale à M+N-1.
 
 
Mon problème se situe à l'étape 2, je ne sais vraiment pas comment implémenter cette étape.
Je sais qu'il faut faire un zéro padding sur les vecteurs A ET B pour les avoir avec une taille égale à M+N-1 avant de faire leur transformée de fourrier
 
Aidez moi, c'est la seule étape qui reste pour que je finisse un projet.
Je vous mets mon code à la suite et à la ligne 51 se trouve la fonction qui permet de faire la multiplication des transformées de fourrier
 

Code :
  1. void confftW (fftw_complex* A, fftw_complex* B, int M, int N) {
  2.     fftw_complex* Apadding, * Bpadding, ApaddingFFT,BpaddingFFT*R, *IR;
  3.     fftw_plan     plan_a, plan_b, plan_R;
  4.     int           i;
  5.     /* Allocate input & output array */
  6.     Apadding = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1);
  7.     Bpadding = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1);
  8.     ApaddingFFT = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1);
  9.     BpaddingFFT = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1);
  10.     IR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1);
  11. //0-padding de A et B
  12. for (i = 0; i < M+N-1; i++)
  13.     {
  14.        //Pour Simplifier on considère que A et B sont de même taille
  15.        //M=N
  16.        if (i<M)
  17.        {
  18.        Apadding [i][0] = A[i][0];
  19.        Bpadding [i][0] = B[i][0];
  20.        }
  21.        else
  22.        {
  23.        Apadding [i][0] = 0.0;
  24.        Bpadding [i][0] = 0.0; 
  25.        }
  26.        Apadding [i][1] = 0.0;
  27.        Bpadding [i][1] = 0.0; 
  28.     }
  29.     /* Create plans */
  30.     plan_a = fftw_plan_dft_1d(M+N-1, Apadding , ApaddingFFT, FFTW_FORWARD,  FFTW_ESTIMATE);
  31.     plan_b = fftw_plan_dft_1d(M+N-1, Bpadding , BpaddingFFT, FFTW_FORWARD,  FFTW_ESTIMATE);
  32.     plan_R = fftw_plan_dft_1d(M+N-1, R, IR, FFTW_BACKWARD, FFTW_ESTIMATE);
  33.     /*Exécution des TF de A et B*/
  34.     fftw_execute(plan_a);
  35.     fftw_execute(plan_b);
  36.     R = Multiply(BpaddingFFT,ApaddingFFT); // FONCTION QUE JE VEUX IMPLEMENTER
  37.     //Exécution de la transformée de fourier inverse de R qui va stocker
  38.     // le resultat dans IR
  39.     fftw_execute(plan_R);
  40.     /* Free memory */
  41.     fftw_destroy_plan(plan_a);
  42.     fftw_destroy_plan(plan_b);
  43.     fftw_destroy_plan(plan_R);
  44.     fftw_free(Apadding );
  45.     fftw_free(Bpadding );
  46.     fftw_free(ApaddingFFT );
  47.     fftw_free(BpaddingFFT );
  48.     fftw_free(IR);
  49. }


 
Je vous remercie d'avance

Reply

Marsh Posté le 05-10-2011 à 16:49:41   

Reply

Marsh Posté le 06-10-2011 à 17:30:09    

ya rien à faire, c'est une multiplication élément par élément

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed