begin process at 2012 05 28 23:17:40
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

Convolution de 2 tableaux avec FFTW


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Convolution de 2 tableaux avec FFTW

mercredi 5 octobre 2011 à 16:59:32 | Convolution de 2 tableaux avec FFTW

pachalcs

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 53 (R = Multiply(BpaddingFFT,ApaddingFFT);) se trouve la fonction qui permet de faire la multiplication des transformées de fourrier.

Code C/C++ :
void confftW (fftw_complex* A, fftw_complex* B, int M, int N) { 
 
    fftw_complex* Apadding, * Bpadding, ApaddingFFT,BpaddingFFT*R, *IR; 
    fftw_plan     plan_a, plan_b, plan_R; 
    int           i; 
 
    /* Allocate input & output array */ 
    Apadding = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1); 
    Bpadding = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1); 
 
 
    ApaddingFFT = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1); 
    BpaddingFFT = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1); 
    IR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M+N-1); 
 
 
//0-padding de A et B 
 for (i = 0; i < M+N-1; i++) 
    { 
       //Pour Simplifier on considère que A et B sont de même taille 
       //M=N 
       if (i<M) 
       { 
       Apadding [i][0] = A[i][0]; 
       Bpadding [i][0] = B[i][0]; 
       } 
       else 
       { 
       Apadding [i][0] = 0.0; 
       Bpadding [i][0] = 0.0;   
       } 
 
       Apadding [i][1] = 0.0; 
       Bpadding [i][1] = 0.0;   
    } 
 
    /* Create plans */ 
    plan_a = fftw_plan_dft_1d(M+N-1, Apadding , ApaddingFFT, FFTW_FORWARD,  FFTW_ESTIMATE); 
 
    plan_b = fftw_plan_dft_1d(M+N-1, Bpadding , BpaddingFFT, FFTW_FORWARD,  FFTW_ESTIMATE); 
 
 
 
    plan_R = fftw_plan_dft_1d(M+N-1, R, IR, FFTW_BACKWARD, FFTW_ESTIMATE); 
 
 
    /*Exécution des TF de A et B*/ 
    fftw_execute(plan_a); 
    fftw_execute(plan_b); 
 
    R = Multiply(BpaddingFFT,ApaddingFFT); // FONCTION QUE JE VEUX IMPLEMENTER 
 
    //Exécution de la transformée de fourier inverse de R qui va stocker 
    // le resultat dans IR 
    fftw_execute(plan_R); 
 
 
    /* Free memory */ 
    fftw_destroy_plan(plan_a); 
    fftw_destroy_plan(plan_b); 
    fftw_destroy_plan(plan_R); 
    fftw_free(Apadding ); 
    fftw_free(Bpadding ); 
    fftw_free(ApaddingFFT ); 
    fftw_free(BpaddingFFT ); 
    fftw_free(IR); 
 
}

jeudi 6 octobre 2011 à 09:18:22 | Re : Convolution de 2 tableaux avec FFTW

louis14

Bonjour,
Après m'avoir fait confirmer mes souvenirs qui sont un peu vagues, il semble bon de faire du padding et en ce qui concerne la multiplication il faut la faire élément par élément.
Maintenant pour la convolution as-tu regardé du côté de CLAPACK, il y a une fonction pour la faire. De plus tu peux trouver des dll optimisées pour le processeur de ton PC (MKL pour Intel qui contient aussi une foncton fft et ACML pour AMD).
Tu trouveras une discussion sur ton sujet à cette adresse ave un morcau de code qui te servira :http://cboard.cprogramming.com/general-discussions/94954-fft-convolution.html


louis
jeudi 6 octobre 2011 à 09:23:26 | Re : Convolution de 2 tableaux avec FFTW

louis14

Bonjour,
Après m'être fait confirmer mes souvenirs , je te conseille de faire le padding et pour la multiplication il faut le faire élément par élément. Tu trouveras une discussion sur ce sujet à cette adresse avec un morceau de code qui peut te servir :http://cboard.cprogramming.com/general-discussions/94954-fft-convolution.html

Mantenat pour la convolution, as-tu regardé du côté de Lapack ( CLapack pour le c++) qui possède une fonction de convolution. De plus il y a des bibliothèque optimisées en foncton du proceseur du PC ( MKL pour intel qui contient auss une fft et ACML pour AMD)

Bon codage.

louis


Cette discussion est classée dans : plan, tf, fftw, complex, apadding


Répondre à ce message

Sujets en rapport avec ce message

arriere plan(background) [ par cognac ] Avec dev4++. Comment changer la couleur de l'arriere plan (mode dos)?Merci Quelle API pour mettre en premier plan une autre fenetre ? [ par Kheo ] Afin d'eviter d'avoir plusieurs instance de mon soft en memoire au tout debut j'effectue un FindWindow sur le titre de mon soft. S'il ne trouve rien j comment forcer une boite de dialogue "ouvrir" ou "enregistrer sous" au premier plan [ par nixon666 ] Je crèe une boite de dialogue "ouvrir" ou "enregistrer sous" avec la commande GetOpenFileName et GetSaveFileName, mais lorsque j'exécute la première f fenêtre arrière plan [ par wanny ] Bonjour.DAns une appli, j'ai une ou plusieurs fenêtre(s) graphique (classe fille de CView).Je clique sur un menu de la mainframe pour changer des para application en arriere plan [ par flatmax ] salutje viens de faire une application (dos) et j'aimerais que cette appli tourne en arriere-plan, sans avoir besoin d'etre active.je m'explique, j'ai exécuter une fonction en arrière plan [ par sena ] Bonjour,kelk'un aurait - il un exemple simple d'exécution d'une fonction en arrière plan !Car la solution 1 ne fonctionne évidemment pas, car la fonct help : collisions particules en OpenGL [ par kx2k3 ] je suis en train de plancher sur des particules en ce moment, en openGLje voudrais les faire rebondir sur un plantous les exemples que j'ai trouvés le comment mettre une fonction en arrière plan? [ par xytron ] Bonjour les amis,voila je reviens de la msdn de visual C++ et je n'ai pas trouvé comment faire pour mettre un fonction en arrière plan.Je veus faire c [win32] forcer une fenetre a rester en premier plan [ par tcok ] bonjour a tous,voila mon probleme, je developpe une application qui protege l'ordinateur sur lequel elle tourne, pendant l'absence de l'utilisateur, e Programme fonctionnant en arriere plan [ par bdkiller ] Bonjour, je cherche a faire un programme qui va fonctionner en arriere plan, cad je crée un controlleur de winamp, et j'utilise ceci comme code: (je s


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales