软件均衡器如何工作?

信息处理 过滤器 有限脉冲响应 无限脉冲响应 均衡器 参数方程
2022-02-11 18:57:21

最近,我一直在研究 IIR 和 FIR 滤波器,并尝试使用微控制器创建参数均衡器。更具体地说,我使用其上的 ADC 以大约 44 kHz 的频率对音频进行采样,在抓取样本之间,我使用时间来处理信号并将其传递到 DAC。

不过让我有点困惑的是,这个过程似乎非常激烈,并且通常需要在样本之间的大部分时间来完成所有处理(使用 8 个 2 极 IIR 带通滤波器)。

像 Spotify 这样的程序,或者像大多数 Galaxy 手机这样的设备都有类似的均衡器,但它们在非专用硬件上运行,我真的很困惑他们是如何做到这一点的?有谁知道他们是否基本上以更快的速度做同样的事情,或者我错过了什么秘诀?

我从未在这些平台上测试过前面提到的任何一个均衡器,所以也许它们真的很糟糕,但至少只是通过听它们,听起来并不可怕。

2个回答

这在很大程度上取决于您如何实现它。

  1. 一个双二阶大约需要 10 次算术运算。(准确地说,转置形式 II 需要 4-5 次乘法和 3 次加法,具体取决于增益管理的完成方式)。
  2. 算术运算转化为处理器的时钟周期。这在很大程度上取决于您的指令集的效率以及您在编写代码方面的能力。在一个好的 DSP 上,您可以在 4 个时钟周期(每个周期大约 2 个操作)内完成一个双二阶运算,而一个具有不错 ALU 的通用 ARM 可能需要 15-20 个周期。在没有本机硬件乘法器的蹩脚微控制器上,这可能需要 50-100 个周期。
  3. 基于帧与基于样本的处理。从 ADC 读取数据、将其移入处理器以及将其移至 DAC 会产生大量开销。这就是为什么大多数实现将处理一帧数据而不是一次处理一个样本。这会“摊销”整个框架的开销。一个好的处理器也将允许在硬件支持的情况下执行此操作,即它将使用 DMA 通道将数据从/到 DAC/ADC 移动到内部存储器,而 CPU 不必做任何事情。
  4. 现代智能手机(即使是便宜的)内部的芯片非常强大:它们通常是四核 ARM,带有一些用于媒体处理的硬件加速器(Neon、SIMD)。它们的时钟都在多 GHz 范围内,并且对外围设备和图形加速器具有良好的硬件支持。我值得信赖的旧三星 S8 有一个 8 核 2 GHz Snapdragon:https ://www.zdnet.com/article/qualcomm-snapdragon-835-what-does-the-kryo-280-adreno-540-spectra-180-x16 -and-hexagon-682-mean-for/#:~:text=%20Snapdragon%20835%20is%20compried,result%20in%20optimized%20power%20savings .

让我们举一个简单的例子:在一个像样的 ARM 内核上编码良好的双二阶应该需要大约 15 个周期。对于在立体声信号(两个通道)上以 44.1 kHz 运行的 8 个双二阶,大约只有 10M 周期/秒。这大约是 1 GHz 时单个内核的 1% 或整个芯片的 0.25%。在我的 Snapdragon 835 上,它会低于 0.03%

我认为您并不孤单,但本质上这只是一个优化问题。假设您有一个时钟频率为 88MHz 的处理器。在 44kHz 时,每个样本有 2k 个时钟。如果我们将“大部分”一词表示为 50% 的时钟,那么每个样本剩下 1k 个时钟用于过滤。运行 8 个过滤器会为每个过滤器留下 125 个时钟。这是相当长的时间,但数据需要移动,数学需要完成。所以现在我们需要弄清楚如何最小化每个滤波器的时钟数。

一方面,您可以一次处理多个样品。这将减少将内存周围的数据移动到寄存器所花费的时间。通过这种方式可以大大降低加载系数之类的东西,并且输入和输出流也可能会有所收获。

对于两个,您可以利用处理器的功能。如果它没有浮点单元,请使用定点数学。如果它有乘法累加指令,请确保使用它们。基本上确保您的汇编输出没有发生一堆疯狂的事情。

最后,您可以使用其他过滤器拓扑。直接/转置直接形式 I 或 II。也许看看不同的结构,如格、并行、状态变量。很多比我们聪明的人在这方面花了很多时间,并且有一些关于这个主题的有趣文献。但是,我通常建议从前两个想法开始。不同的拓扑可能具有难以理解的限制。