Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1505 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Convolution de 2 tableaux unidimensionnels avec FFTW C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Convolution de 2 tableaux unidimensionnels avec FFTW C++

n°2104929
pachalcs
Posté le 05-10-2011 à 16:49:41  profilanswer
 

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

mood
Publicité
Posté le 05-10-2011 à 16:49:41  profilanswer
 

n°2105138
GrosBocdel
Posté le 06-10-2011 à 17:30:09  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Convolution de 2 tableaux unidimensionnels avec FFTW C++

 

Sujets relatifs
Dessiner graphe via un programme C++Core dumped en C
C/C# peu importe, Lister les cartes sonCompiler des sources C++ sur Windows
Problème connection base de données en C++Programme en C qui demande la saisie du JJ/MM/AAAA
[resolut|C] Le jeu de la vie: cellules adjacentes[C#/.NET]Exception 0x8007007E et import de dll
Plus de sujets relatifs à : Convolution de 2 tableaux unidimensionnels avec FFTW C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR