0

我正在尝试对两个信号进行简单的卷积。一个是信号(例如音乐),另一个是 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),我在最后添加了 +n/2 个零样本或音乐和 IR,用于卷积,然后使用 4 个重叠缓冲区(这是所需的数量)并在时间合适时计算两者的 FFT,然后相乘,然后 iFFT 等。

其次是 CDFT(复杂 DFT:re & im in & out),我每两个样本放一个音乐样本(虚部为零),然后做 cdft,相乘等

但两者都不起作用并给出相同的结果:反转和延迟声音的奇怪混合。

请帮忙。

  • 项目清单
4

1 回答 1

0

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

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

利用

fftMusic = fftMusic .* fftIR;

现在对于您的问题,您是否尝试过简单的普通卷积?如果是,结果如何?

于 2013-06-23T19:00:53.547 回答