使用快速卷积将 HRIR 应用于声波

信息处理 fft 卷积 快速卷积
2022-02-24 22:15:56

我有十几个源声波;每个持续时间约为一秒。我想把每一个都通过一个数字滤波器(我将它截断为 128 个抽头)。

目前我正在使用沼泽标准卷积来执行此操作。它正在消耗大量的 CPU。

我想切换到快速卷积。

有人可以概述步骤吗?

我知道基本技术是 iFFT ( FFT(src) * FFT(filter) ),但源和滤波器的长度不同。

所以我想象做的是这样的:

对于每个(源、过滤器)对:

  • 在 512 个抽头处截断每个滤波器并对其进行 FFT 以提供 256 个频率区间。
  • 现在使用 512 的窗口大小以 128 个样本增量逐步遍历源。

    对于每个步骤,
    * 乘以(Hanning?)窗口,
    * FFT
    * 将 FFT 与滤波器的 FFT 相乘(每个 bin 上的复数乘法)
    * 添加到目标缓冲区

  • 将目标缓冲区的幅度除以 4,就像我们做了 4 x 重叠

我在这一点上的问题是:1.基本方法对吗?2. 我需要对过滤器进行零填充吗?3. 4x 重叠是否合适/最佳?4.那个窗口正确吗?有没有办法优化窗口步骤?5. 这个输出与标准卷积相比有多好?

π

编辑:我刚刚注意到最后除以 4 可能是错误的,不应该使用窗口函数 A_w 下的区域吗?所以将所有内容都乘以 A_w / 4。这样对吗?

1个回答

谷歌“重叠添加”。快速大纲

  1. 零填充滤波器到 256 个抽头,进行 FFT
  2. 初始化并“重叠”长度为 128 的缓冲区轻按到全零
  3. 将输入指针初始化为 0
  4. 循环从这里开始
  5. 从输入指针开始从输入中获取 128 个样本。零填充到 256,FFT
  6. 乘以 FFT
  7. 逆 FFT,将重叠缓冲区添加到前 128 个样本,输出这些样本。将第二个 128 个样本放入重叠缓冲区
  8. 将输入指针前进 128 个样本并返回到步骤 5。重复直到输入全部完成

一些快速提示:

  1. 重叠保存速度稍快但不太直观。
  2. 如果滤波器和信号都是实值,您可以通过实现基于 N/2 复数 FFT 的实值 FFT 或通过成对组合滤波器和/或信号来进一步加快速度
  3. 128 可能接近基于 FFT 和直接 FIR 滤波之间的收支平衡点。我不会期望巨大的收益。根据硬件和代码优化级别,它实际上可能会更慢。