Bonjour,
je cherche a réaliser la convolution d'une série de données (data) avec une fonction réponse.
Mais j'ai un peu de mal a comprendre l'algorithme de NRiC. Pourtant sur le principe, ça devrait être plutôt simple, en utilisant la FFT, la convolution devrait être le produit en chaque point de la transformée de fourier de data et de réponse non ? en tenant compte du facteur d'echelle, 1/N.
Pourtant dans NRiC, ce n'est pas ce qui est effectue, on multiplie FFT(data[i])*FFT(reponse[i]) puis on y soustrait FFT(data[i+1])*FFT(reponse[i+1])
Et pour la deconvolution (-1 dans le code) c'est encore plus étrange, la ou devrait trouver une division pour revenir a data, c'est toujours une multiplication.
Si vous pouvez m'éclairer un peu, ca m'avancerait bien!
merci
dans le code, ans et la transformée de fourrier de Data, temp et la transformée de fourrier de réponse,
ans (et temp) est stockée tel que
" in array ans[0..n-1]) by the positive frequency half of their complex Fourier transform. The real-valued first and last components of the complex transform are returned as elements ans[0] and ans[1], respectively "
Code :
- if (isign == 1)
- {
- for (i=2;i<n;i+=2)
- { //Multiply FFTs to convolve.
- tmp=ans[i];
- ans[i]=(ans[i]*temp[i]-ans[i+1]*temp[i+1])/no2;
- ans[i+1]=(ans[i+1]*temp[i]+tmp*temp[i+1])/no2;
- }
- ans[0]=ans[0]*temp[0]/no2;
- ans[1]=ans[1]*temp[1]/no2;
- }
- else if (isign == -1)
- {
- for (i=2;i<n;i+=2)
- {// Divide FFTs to deconvolve.
- if ((mag2=SQR(temp[i])+SQR(temp[i+1])) == 0.0)
- throw("Deconvolving at response zero in convlv" );
- tmp=ans[i];
- ans[i]=(ans[i]*temp[i]+ans[i+1]*temp[i+1])/mag2/no2;
- ans[i+1]=(ans[i+1]*temp[i]-tmp*temp[i+1])/mag2/no2;
- }
- if (temp[0] == 0.0 || temp[1] == 0.0)
- throw("Deconvolving at response zero in convlv" );
- ans[0]=ans[0]/temp[0]/no2;
- ans[1]=ans[1]/temp[1]/no2;
- }
- else throw("No meaning for isign in convlv" );
- realft(ans,-1); Inverse transform back to time domain.
|