我已经阅读了DSP指南,看起来好像3年了。直到最近才对编程感到满意,我决定开始尝试使用基于FFT的卷积,1D准确,一个真实,一个复杂的输出。
我偶然发现了一些获得FFT和IFFT的代码并使其工作,我在复杂的频域中获得了正确的DFT,经过一点点的操作(将复杂的数组分成两个独立的实数和虚构的数组)并通过IFFT运行它,然后再次进行更多的位操作,使原始输入像预期的一样。
现在也许我对卷积的概念都错了,只是简单地将复杂数组的元素相乘,然后通过IFFT运行结果给出了虚假的数字。 要测试我只是制作一个渐变内核,并将dirac delta函数作为输入并将结果插入到IFFT中,代码没有按预期提供原始内核
public void convolution(double [] xReal, double [] xImag,
double [] hReal, double [] hImag){
for (int i = 0; i < n; i++){
xReal[i] *= hReal[i];
xImag[i] *= hImag[i];
}
}
我的问题是:这是用于将复数DFT的元素相乘的代码。
我一直在寻找简单的卷积代码或仅仅是背后的数学但却没有这样的运气。我发现的所有东西都是&#34;频域中的乘法等于时域中的卷积&#34;。
答案 0 :(得分:1)
频域中的乘法执行循环卷积,而不是直线卷积,除非您将FFT和IFFT归零,使其长于时域信号长度和全时域脉冲响应的总和。 (零垫,因为所有零的圆形包裹/周围都没有环绕)。
此外,对于卷积,您需要乘以零填充脉冲响应(其频率响应)的变换(FFT),而不是脉冲响应本身。
此外,乘法必须是复数乘法,而不是2个分离的分量向量的乘法。