【问题标题】:Difference between conv and fftfilt in MATLABMATLAB中conv和fftfilt的区别
【发布时间】:2011-10-13 16:00:22
【问题描述】:

MATLAB 中的“conv”和“fftfilt”函数有什么区别?

我读到 conv 是在时域中完成的,而 fftfilt 在频域中进行乘法之前首先使用重叠相加方法进行 FFT。但是,我不确定这些不同的方法将如何影响结果(因为我认为时域中的卷积与频域中的乘法相同),以及何时应该使用另一种?

【问题讨论】:

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

标签: matlab


【解决方案1】:

从时域到频域的转换有其自身的计算代价。尽管结果应该相同,但时间可能会因输入长度而异。您会发现following post 很有用。如需更深入的分析,您可以阅读时域和频域中的 FFT/卷积。

【讨论】:

  • 一般来说,您只需将较短的信号转换一次。假设短信号为Nlong,长信号为Mlong。朴素卷积将采用N*M 操作。重叠保存将采用2*N*log(2*N)*(M/(2*N)+1) ~= M*log(2*N) 操作。如果N=M=10,那么卷积的100 ops更好。如果N=100, M=10000,那么如果实现是等效的,则重叠保存的~80000 操作会更好。很遗憾 Mathworks 决定将 fftfilt 实现为 m 文件。
猜你喜欢
  • 2012-01-14
  • 2019-05-11
  • 1970-01-01
  • 2011-12-06
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多