Salut,
Alors voilà, j'essaye d'écrire un plugin VST (traitement audio en temps-réel) qui ferait du filtrage par FFT, et je n'y arrive pas trop...

J'ai essayé d'implémenter la méthode overlap-add, en remplissant donc l'autre moitié du buffer avec des 0 et en faisant la transformée de fourier de tout ça.

Voilà mon code :
(Tous les buffers outdata, indata ont une taille 1024). Pour l'instant je recopie sur les deux canaux de sortie le canal gauche d'entrée, la stéréo viendra quand ça ça marchera...
Code : 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
37
38
39
40
41
42
 
for (int s = 0; s < nFrames; ++s, ++in1, ++in2, ++out1, ++out2)
  {
 
	  if(current_buf == 0)
	  {
		  *out1 = outdata1[pos_in_data]  + outdata2[pos_in_data + 512];
		  *out2 = outdata1[pos_in_data]  + outdata2[pos_in_data + 512];
		  indata1[pos_in_data] = *in1;
		  if(++pos_in_data > 512)
		  {
			   memset(indata1 + 512, 0, sizeof(kiss_fft_scalar) * 512);
 
			   kiss_fftr(fftcfg, indata1, sdata);
			   kiss_fftri(ifftcfg, sdata, outdata1);
			   for(int i = 0; i < 1024; ++i)
				   outdata1[i] = outdata1[i] / 1024.;
			   pos_in_data = 0;
			   current_buf = 1;
		  }
	  }
	  else
	  {
 
		  *out1 = outdata2[pos_in_data] + outdata1[pos_in_data + 512];
		  *out2 = outdata2[pos_in_data] + outdata1[pos_in_data + 512];
		  indata2[pos_in_data] = *in1;
 
		  if(++pos_in_data > 512)
		  {
			   memset(indata2 + 512, 0, sizeof(kiss_fft_scalar) * 512);
 
			   kiss_fftr(fftcfg, indata2, sdata);
			   kiss_fftri(ifftcfg, sdata, outdata2);
			   for(int i = 0; i < 1024; ++i)
				   outdata2[i] = outdata2[i] / 1024.;
			   pos_in_data = 0;
			   current_buf = 0;
		  }
	  }
 
  }

Voilà, merci de votre aide !