【问题标题】:Simple audio filter-bank简单的音频滤波器组
【发布时间】:2011-05-05 17:00:04
【问题描述】:

我是音频过滤器的新手,如果我说错了,请见谅。

我喜欢编写一个代码,它可以将存储在 PCM 样本中的音频分成两个或三个频段,并对它们进行一些操作(例如修改它们的音频电平)或分析它们,然后从输出中重建音频样本。

据我在互联网上阅读此任务,我可以使用 FFT-IFFT 并对复杂形式进行操作,或者使用基于时域的滤波器组,例如 MP2 音频编码格式使用的滤波器组。也许过滤器组是一个更好的选择,至少我在某个地方读到它在实时流环境中对 CPU 使用更友好。但是,我很难理解滤波器组背后的数学知识。我正在尝试查找有关此主题的一些源代码(最好是 Java 或 C/C++),但到目前为止没有成功。

谁能给我一些提示或链接,让我更接近示例过滤器库?

【问题讨论】:

  • FFT-manipulate-IFFT 可能是最容易实现和最灵活的。
  • 您是否为此找到了特定的过滤器?我想为我的项目尝试一个小波滤波器组,它似乎并不类似于滤波器,即一个滤波器,你可以输入数据流并输出经过过滤的数据流,而在小波中我不知道它们是否主要设计用于数据流的输入输出?你有解决办法吗?

标签: audio signal-processing


【解决方案1】:

使用 FFT 将音频信号分成几个频段是多余的。

您需要一两个 Linkwitz-Riley 过滤器。这些滤波器将信号分成高频和低频部分。

这个滤波器的一个很好的特性是,如果你添加低频和高频部分,你几乎可以得到原始信号。会有一点点相移,但耳朵听不到。

如果您需要两个以上的波段,您可以链接过滤器。例如,如果你想将 100 和 2000Hz 的信号分开,它会在伪代码中有点像这样:

low  = linkwitz-riley-low (100, input-samples)
temp = linkwitz-riley-high (100, input-samples)

mids = linkwitz-riley-low (2000, temp)
highs = linkwitz-riley-high (2000, temp);

等等..

分离信号后,您可以放大三个输出频段:低、中和高,然后将它们加在一起以获得处理后的信号。

过滤器部分本身可以使用 IIR 过滤器来实现。谷歌搜索“Linkwitz-Riley 数字 IIR”应该会得到很多不错的结果。

http://en.wikipedia.org/wiki/Linkwitz-Riley_filter

【讨论】:

  • 这看起来正是我正在寻找的。我现在只需要找到一个例子。 :)
  • 我刚刚在 Java 中完成了来自this code(cmets 中的二阶版本)的过滤器。它工作得很好。然而,截止并不像我预期的那么尖锐。我该如何改进呢? 4 阶版本会在这方面做得更好吗?
【解决方案2】:

您应该查找小波,尤其是 Daubechies 小波。它们会让你成功,它们是 FIR 滤波器,而且它们真的很短。

更新 在没有解释的情况下投票并不酷。另外,我是对的。小波是滤波器组,它们的工作是精确地完成问题中描述的内容。恕我直言,就是这样。我自己已经做过很多次了。

【讨论】:

  • 这看起来很有趣,谢谢提及。我已经找到了一篇关于音频和小波here 的好论文。但是完全理解它仍然是我的技能,我找不到示例程序的源代码。
  • @Phonon,如果您愿意分享 +1,我很乐意看到一些简单的示例代码
  • @learnvst 我需要使用我的旧笔记本电脑,所以请给我一两天时间。为此,我有一些 MATLAB 例程。
  • @Phonon 听起来很棒。我会耐心等待的。
【解决方案3】:

有很多过滤器源码可以找到here

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 2011-06-02
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多