1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
// Creation des buffers
double* hsupp = new double[L];
double* filter = new double[L];
double* result = new double[M];
double* fft_signal = new double[L];
double* fft_filter = new double[L];
double* fft_result = new double[M];
// Creation du filtre passe-bas (avec un algo trouvé sur le net)
for (int i=-(L-1.0)/2.0; i<=(L-1.0)/2.0; i++, j++)
hsupp[j] = i;
for (int i=0; i<L; i++)
filter[i] = (2.0*fc/Fs)*sinc(2.0*fc*hsupp[i]/Fs);
// Calcul des FFT signal et filtre
memcpy(fft_signal, x, M*sizeof(double));
LabCore::rsrfft(fft_signal, OFFSET);
memcpy(fft_filter, filter, L*sizeof(double));
LabCore::rsrfft(fft_filter, OFFSET);
// Convolution des 2 FFT (à mon avis, c'est ici qu'il y a un problème !)
for (int i=0; i<M; i++)
fft_result[i] = fft_filter[i] * fft_signal[i];
// Calcul de la transformé inverse
memcpy(result, fft_result, M*sizeof(double));
LabCore::irsrfft(result, OFFSET);
// Normalisation de FFT (juste pour l'affichage)
fft_signal = normalize(fft_signal, L);
fft_filter = normalize(fft_filter, L);
fft_result = normalize(fft_result, L);
for (int i=0; i<L; i++)
printf("\"%.09f\";\"%.09f\";\"%.09f\";\"%.09f\";\"%.09f\";\"%.09f\"\n", x[i], hideal[i], result[i], fft_signal[i], fft_filter[i], fft_result[i]); |
Partager