使工作成为奥拉斯的FFT



我正在尝试对两个信号进行简单的卷积。一个是信号(例如音乐),另一个是IR(像这样的简单延迟:

IR[0] = 1.0
IR[1->511] = 0 
IR[512] = 0.5
IR[513->1023] = 0;

所以它应该产生一个小的回声。

我知道了时域中的卷积,就是频域中的乘法。

所以我的想法是对两个信号(音乐和IR)进行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);

唯一的问题是它不起作用。

我已经尝试了RFDT和CFDT,但我产生了一个奇怪的结果:我的信号被延迟了,但在反向中。这是FFT的东西吗?

首先,对于RDFT(Real DFT:re in,re&im out),我在音乐和IR的末尾添加+n/2个零样本,用于卷积,然后使用4个重叠的缓冲区(这是所需的数量),并在时间合适时计算两者的FFT,然后相乘,然后iFFT等。

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

但两者都不起作用,产生了相同的结果:反转和延迟声音的奇怪混合。

请帮忙。

  • 列出项目

首先,使用矢量化代码而不是是一种很好的做法

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

使用

fftMusic = fftMusic .* fftIR;

现在来谈谈你的问题,你试过简单的卷积吗?如果是,结果是什么?

相关内容

  • 没有找到相关文章

最新更新