重叠添加与重叠保存

信息处理 fft 过滤器 卷积 快速卷积
2022-01-11 23:01:47

可以使用哪些差异或其他标准来帮助决定使用重叠添加和重叠保存进行过滤?重叠添加和重叠保存都被描述为使用 FIR 滤波器内核对数据流进行基于 FFT 的快速卷积的算法。如果有的话,延迟、计算效率或缓存位置(等)的差异是什么?或者他们是一样的?

2个回答

从本质上讲,OS 的效率稍高一些,因为它不需要添加重叠瞬变。但是,如果您需要重用具有零填充而不是重复样本的 FFT,则可能需要使用 OA。

这是我不久前写的一篇文章的快速概述

快速卷积是指分块使用循环卷积来完成线性卷积。快速卷积可以通过OA或OS方法来完成。OS 也被称为“重叠”。在 OA 滤波中,每个信号数据块只包含与允许循环卷积等效于线性卷积一样多的样本。在 FFT 之前对信号数据块进行零填充,以防止滤波器脉冲响应“缠绕”到序列的末尾。OA 滤波将一个模块的输入开启瞬态与前一个模块的输入关闭瞬态相加。在 OS 过滤中,如图 1 所示,没有对输入数据执行零填充,因此循环卷积不等同于线性卷积。“环绕”的部分是无用的并被丢弃。为了弥补这一点,前一个输入块的最后一部分用作下一个块的开始。OS 不需要添加瞬变,因此比 OA 更快。

通过将滤波器脉冲响应从因果转换为非因果,可以进一步调整 OS 效率。这个来自Wikimedia的 Octave 代码片段显示了两种方法,以及通常的因果过滤方法:

  if edge_effects_at_end_of_filter_output
   %Rotate the filter coefficients
   %Simple way
   %  H = fft([h(M) zeros(1,N-M) h(1:M-1)]);  
   %Fancy way
      H = fft( circshift([h zeros(1,N-M)], -(M-1)) );
      Xb = (1:L);                       % indices of good output
  else
      H = fft(h,N);
      Xb = M-1 + (1:L);                 % indices of good output
  endif

优势体现在“良好产出指数”之间的差异。的索引意味着长度为的逆 DFT 输出缓冲区可以定位在整个输出数组中,与前一个输出段重叠所以先前的输出被简单地覆盖(丢弃),并且没有必要将个“好”输出从一个缓冲区复制到另一个缓冲区。(1:L)L+M1M1M1L