代码之家  ›  专栏  ›  技术社区  ›  P i

如何在C语言中实现带通滤波器(目的:基音检测)?

  •  2
  • P i  · 技术社区  · 14 年前

    我最近问 this question

    我正在寻找一个算法来检测音调。其中一个答案建议我使用初始FFT来获得基本频率响应,找出哪些频率被混音,然后在每个感兴趣的区域使用带通滤波器进行跟踪:

    一个稍微先进的算法可以这样做:

    1. 粗略地检测基音频率(可以用DFT来完成)。
    2. 计算滤波信号中两个峰值之间的采样数。

    我已经开始了 here :但我可以看到问题所在:FFT可以区分一个人可能唱的所有音符,这需要很多样本,而且我不想执行太多不必要的计算,因为我的目标是移动设备。

    所以我试图理解上面的答案,但我不明白如何将带通滤波器的概念应用到代码中。

    有人能帮忙吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Fantius    13 年前

    滤波器设计相当复杂。有很多技巧。首先你必须决定你想创建什么样的过滤器。有限脉冲响应(FIR)?无限脉冲响应(IIR)?然后选择一种算法来设计这种类型的过滤器。Remez算法通常用于FIR滤波器的设计。来看看我所指的复杂性: http://en.wikipedia.org/wiki/Remez_algorithm

    创建过滤器的最佳方法是使用现有的信号处理库。快速的谷歌搜索让我想到了这里: http://spuc.sourceforge.net/

    考虑到您的应用程序是什么,您可能希望了解匹配的筛选器。我不确定它们是否与此相关,但它们可能是。 http://en.wikipedia.org/wiki/Matched_filter