Visual c++ 让工作成为奥普拉斯';s FFT

Visual c++ 让工作成为奥普拉斯';s FFT,visual-c++,fft,vst,ifft,Visual C++,Fft,Vst,Ifft,我想对两个信号做一个简单的卷积。一个是信号(例如音乐),另一个是IR(简单延迟,如本方案: IR[0] = 1.0 IR[1->511] = 0 IR[512] = 0.5 IR[513->1023] = 0; 所以它应该会产生一个小的回声 我知道时域中的卷积是频域中的乘法 所以我的想法是对两个信号(音乐和红外)进行FFT,然后将得到的偶数re&im(来自re+im*i)相乘,然后进行iFFT并欣赏结果 fft(fftMusic); fft(fftIR); for (int i

我想对两个信号做一个简单的卷积。一个是信号(例如音乐),另一个是IR(简单延迟,如本方案:

IR[0] = 1.0
IR[1->511] = 0 
IR[512] = 0.5
IR[513->1023] = 0;
所以它应该会产生一个小的回声

我知道时域中的卷积是频域中的乘法

所以我的想法是对两个信号(音乐和红外)进行FFT,然后将得到的偶数re&im(来自re+im*i)相乘,然后进行iFFT并欣赏结果

fft(fftMusic);
fft(fftIR);
for (int i = 0; i < n; i++)
    fftMusic[i] = fftMusic[i] * fftIR[i];
ifft(fftusic);
for (int i = 0; i < n; i++)
        fftMusic[i] = fftMusic[i] * 2/double(n);
fft(fftMusic);
fft(fftIR);
对于(int i=0;i
唯一的问题是它不起作用

我试过RFDT和CFDT,结果很奇怪:我的信号延迟了,但是相反。这是FFT吗

首先,对于RDFT(实际DFT:re-in,re&im-out),我在末尾添加了+n/2个零采样,或者同时添加了music和IR,用于卷积,然后使用4个重叠缓冲区(这是所需的数字),并在时间正确时计算两者的FFT,然后进行乘法,然后进行iFFT等

第二,对于CDFT(复数DFT:re&im in&out),我每两个样本放一个音乐样本(虚数部分为零),然后进行CDFT,乘法,等等

但是这两种方法都不起作用,并且产生了相同的结果:一种奇怪的反向和延迟声音的混合

请帮忙

  • 列表项

首先,使用矢量化代码而不是

for (int i = 0; i < n; i++)
    fftMusic[i] = fftMusic[i] * fftIR[i];

现在,对于您的问题,您是否尝试了简单的卷积?如果是,结果是什么?

您需要了解我已经使用了重叠添加方法,我不知道为什么ovelapp save会有所改进(可能性能有点提高)结果。但无论如何还是要感谢。好的-你可以使用重叠加法或重叠保存,这样你就不会得到循环卷积-从你的问题中不清楚你是否已经在使用重叠加法。显然问题出在别处。频域中的卷积是乘法,对吗?但它是一个复杂的乘法因此,如果我们有bufferInput=(Re_-Input+Im_-Input*i)和IR=(Re_-IR+Im_-IR*i),我们必须将两者相乘为:result=(Re_-Input+Im_-Input*i)*(Re_-IR+Im i)result=(Re_-Input*Re_-IR-Im u-IR)+i*(Re_-Input*Im u-IR+Im Input*Re_-IR)我想这就是复共轭。它终于起作用了……我没有尝试简单的普通卷积,我知道它会起作用,但它需要大量的CPU,所以我放弃了它。
fftMusic = fftMusic .* fftIR;