嵌入式系统音频实时抽取的 FIR 滤波器设计

信息处理 声音的 有限脉冲响应 抽取
2022-02-11 00:33:21

我需要设计一个低通 FIR 滤波器来对以 250Khz 过采样的音频流进行下采样。目标是在资源严重受限的嵌入式系统上编写音频流的实时音频播放器。

在这个系统上,我没有可用的 DSP 或 FPGA,它是一个非常慢的 CPU(MIPS 200Mhz),但有可用的浮点指令。我熟悉代码优化、汇编以及确保实现高效所需的一切,但我对滤波器设计几乎一无所知。

流的输出采样率应该是 22050Hz(但是 20k-25k 范围内的任何东西都可以,因为我控制着 DAC 时钟,所以我可以将其配置为高达 48Khz 的任何值——但我宁愿留下无论如何,在 20-25K 的输出采样率范围内,除非从滤波器设计的角度来看这被证明是复杂的)。

我还要注意,我不需要这个系统来产生像 CD 这样的高保真音频。我会说听起来像低比特率 MP3 的东西是可以的。只是为了给出另一个参考点,我已经尝试通过简单地对 11 个连续样本的每个窗口进行平均来以因子 M=11 抽取我的流,并且我确实得到了一些预期的混叠,但它并没有那么糟糕——它还不能接受,但我个人预计这种非常简单的下采样会产生更糟糕的结果,而实际上它实际上与我正在寻找的结果非常相似(尽管混叠有时是不可接受的)。

通过在 PC 上使用离线音频转换工具,我还验证了可以将此音频流下采样到 22Khz 并获得足以满足我目标的音频质量,并且没有混叠——我只需要了解如何在如果可能的话,在我的嵌入式系统上实时。

FIR 滤波器必须非常高效,因为我正在进行实时处理,因此希望抽头的数量应该非常少。我现在不知道这里的目标是什么:最快最好,因为系统需要在后台进行其他处理。我个人希望在 10-20 次抽头范围内的东西,但老实说,我还没有对此进行基准测试。我想了解我所做的妥协,并可能使用不同的过滤器进行一些实验,以在音频质量和性能之间找到良好的平衡。

我对信号处理理论的理解几乎为零,尽管我对它的编程方面有所了解(例如:如果你给我系数,我知道如何编写 FIR 滤波器)。

阅读此页面: https ://dspguru.com/dsp/faqs/multirate/decimation/ 我知道我需要先设计这个 FIR 滤波器,然后再抽取我的流。

因此,我试图创建一个 M=11 的抽取滤波器(250000/11 ~= 22727,接近我想要的输出采样率)。我已经阅读了其他资源,这些资源告诉我最好使用多级级联过滤器,但我现在想保持简单,至少先获得基本的了解。

我无法关注该页面的部分是:

通带低频为零;通带上限频率是抽取后要保留的任何信息带宽。通带纹波是您的应用程序可以容忍的任何值。

阻带下限频率是输出速率减去通带上限频率的一半。阻带衰减是根据您的应用程序可以承受的任何混叠设置的。(请注意,抽取器中总会存在混叠,但您只需使用抽取过滤器将其减少到可忽略的值。)

与任何 FIR 一样,抽头数是满足通带和阻带规范所需的任何数量。

我不知道如何将这些见解转换为可用于过滤器的系数列表。我试着用这个简单的在线工具玩了一下:

http://t-filter.engineerjs.com/

但我不确定要输入什么数字。这就是我得到的地方:

  • 采样频率:这是我的输入采样频率,即 250Khz。
  • 在通带滤波器中,我在“From”中输入了“0 hz”,但我不知道在“To”中输入什么。上面链接的页面说“通带上限频率是您想要在抽取后保留的任何信息带宽”。这应该是 22050 赫兹吗?我想不会,但我不知道。
  • 通带波纹:页面上写着“无论您的应用程序可以容忍什么”。由于我对此没有任何背景,因此我无法理解这对它有什么好处。
  • 阻带下限频率:该页面建议我输入输出速率的一半减去通带上限频率。一旦我知道通带上限频率应该是多少,我就可以计算出这个。
  • 阻带上限频率:该页面谈到“阻带衰减”,但没有提及“上限频率”。所以我不知道在这里输入什么。
  • 阻带波纹:页面中没有明确提及,至少我能理解。

提前感谢您提供的任何见解。

编辑:根据要求,我附上了示例流的频谱图片:

一个例子的频谱 来自 Audacity 的频谱

1个回答

下采样在理论上非常简单,但在实践中却很困难。理论上,您只需要使用低于新采样率一半的截止值进行低通滤波器,然后您就可以丢弃额外的样本。

在实践中,滤波器的选择涉及许多权衡,这些权衡高度依赖于您的应用程序的特定要求、您关心的属性以及您正在使用的信号类型。您的频谱图看起来肯定不像音乐或口语,并且您需要有效处理异常数量的高频能量。

如果我理解正确,您可以使用整数下采样 (11),并且您正在为聆听(而不是分析)目的而拍摄“可接受的听觉质量”。

让我们从以下过滤器开始

  1. 通带:0-10 kHz,增益 1,1dB 纹波
  2. 阻带:11kHz-125kHz,增益 0,-60dB 纹波(即 60dB 衰减)。阻带的下边缘应该是最终采样率的一半。

这将需要 527 次抽头。对于每个输出样本,将输入提前 11 个样本并应用该过滤器。由于过滤器是对称的,因此无论您是进行卷积还是仅进行矢量点积都没有关系。

一旦您启动并运行(离线)并验证它是否有效并满足您的要求,您可以尝试将它放在实时平台上并进行调整。

如果 527 抽头太多,可以调整如下:

  1. 降低通带的上限(至 9KHz 或 8 kHz)。这会让它“更沉闷”
  2. 将阻带能量增加到可能 -50dB 或 -40dB。这将增加混叠并且听起来更加失真和“人为”。

模糊不清,直到您在带宽、混叠和抽头数之间取得良好的折衷。

另一种方法是运行 IIR 滤波器,但这必须以更高的采样率运行,因此就效率而言,这可能是一种清洗。