简单的音频滤波器组
Posted
技术标签:
【中文标题】简单的音频滤波器组【英文标题】:Simple audio filter-bank 【发布时间】:2011-05-05 17:00:04 【问题描述】:我是音频过滤器的新手,如果我说错了,请见谅。
我喜欢编写一个代码,它可以将存储在 PCM 样本中的音频分成两个或三个频段,并对它们进行一些操作(例如修改它们的音频电平)或分析它们,然后从输出中重建音频样本。
据我在互联网上阅读此任务,我可以使用 FFT-IFFT 并对复杂形式进行操作,或者使用基于时域的滤波器组,例如 MP2 音频编码格式使用的滤波器组。也许过滤器组是一个更好的选择,至少我在某个地方读到它在实时流环境中对 CPU 使用更友好。但是,我很难理解滤波器组背后的数学知识。我正在尝试查找有关此主题的一些源代码(最好是 Java 或 C/C++),但到目前为止没有成功。
谁能给我一些提示或链接,让我更接近示例过滤器库?
【问题讨论】:
FFT-manipulate-IFFT 可能是最容易实现和最灵活的。 staffwww.dcs.shef.ac.uk/people/N.Ma/resources/gammatone 您是否为此找到了特定的过滤器?我想为我的项目尝试一个小波滤波器组,它似乎并不类似于滤波器,即一个滤波器,你可以输入数据流并输出经过过滤的数据流,而在小波中我不知道它们是否主要设计用于数据流的输入输出?你有解决办法吗? 【参考方案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
【讨论】:
以上是关于简单的音频滤波器组的主要内容,如果未能解决你的问题,请参考以下文章