【发布时间】:2011-10-13 16:00:22
【问题描述】:
MATLAB 中的“conv”和“fftfilt”函数有什么区别?
我读到 conv 是在时域中完成的,而 fftfilt 在频域中进行乘法之前首先使用重叠相加方法进行 FFT。但是,我不确定这些不同的方法将如何影响结果(因为我认为时域中的卷积与频域中的乘法相同),以及何时应该使用另一种?
【问题讨论】:
-
一个域中的卷积确实等价于另一个域中的乘法。然而,对于离散时间、有限长度的信号,它是循环卷积。有关该理论的更多信息,请参阅 en.wikipedia.org/wiki/Convolution#Discrete_convolution、en.wikipedia.org/wiki/Overlap-add 和 stackoverflow.com/questions/2929401/…。
fftfilt和conv应该给出相同的结果,如果更快,请使用fftfilt。 -
另外,您可能对dsp.stackexchange.com 感兴趣。
-
@mtrw:感谢您的 cmets 和链接 - 它们帮助消除了我对不同实现的困惑。我还注意到
conv给出的结果长度为M+L-1,其中M是脉冲响应的长度,L是输入信号的长度。另一方面,fftfilt给出的结果与输入信号的长度相同。我猜这与fftfilt使用重叠添加方法对输入信号的段的处理和截断有关。 -
有趣的是
fftfilt给出的输出缺少样本。原则上,没有理由重叠保存或重叠添加不能给出完全相同长度的输出,但实现必须在输入之一处添加一个额外的零缓冲区,然后在输出时适当地对其进行修剪。看起来 Mathwork 的实现在这方面有点草率。 -
未来滤波器的响应(值 L+1、L+2...)取决于未来的输入,而您不知道它们,因此 MATLAB 在技术上是正确的,大多数应用程序您不知道不需要额外的输出。如果你这样做了,那么你真的需要卷积。
标签: matlab