我正在尝试对两个信号进行简单的卷积。一个是信号(例如音乐),另一个是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;
现在来谈谈你的问题,你试过简单的卷积吗?如果是,结果是什么?