Bonjour à tous,

Pour des besoins professionnel, je dois filtrer un signal issue de capteurs à l'aide d'un filtre passe-bas. Malheureusement, j'ai un peu de mal à mettre ça en place, malgré toutes les explications que j'ai trouvé sur le net.

Voici en gros, mon programme. Y'a un truc que j'ai pas dû comprendre:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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]);

Au final, j'ai un truc qui n'a rien à voir avec mon signal, et qui, en plus, est devenu symétrique par le centre (ce qui n'est pas du tout le cas de mon signal d'origine). Si on pouvait me dire là où ça cloche

Merci beaucoup.
Snark.

PS: oui, le code est un peu dégueux, mais c'est juste du test...