c - 如何在 C 中实现带通滤波器(目的 : pitch detection)?

标签 c algorithm filter detection pitch

我最近问了this question :

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

A slightly advanced algorithm could do something like this:

  1. Roughly detect pitch frequency (could be done with DFT).
  2. Bandpass signal to filter isolate pitch frequency.
  3. Count the number of samples between two peaks in the filtered signals.

现在我可以完成第一步了(我正在为 iOS 编写代码,Apple 有一个用于执行 FFT 等的框架(加速框架)。

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

因此,我正在努力思考上面的这个答案,但我不明白如何将带通滤波器的概念应用到代码中。

有人能帮忙吗?

最佳答案

过滤器设计非常复杂。有很多技巧。首先,您必须决定要创建哪种过滤器。有限脉冲响应 (FIR)?无限脉冲响应 (IIR)?然后选择一种算法来设计该类型的滤波器。 Remez 算法通常用于 FIR 滤波器设计。转到此处查看我所指的复杂性:http://en.wikipedia.org/wiki/Remez_algorithm

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

鉴于您的应用程序是什么,您可能需要阅读有关匹配过滤器的信息。我不确定它们在这里是否相关,但可能相关。 http://en.wikipedia.org/wiki/Matched_filter

关于c - 如何在 C 中实现带通滤波器(目的 : pitch detection)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4104137/

相关文章:

c - 虽然有多个条件

php - 如何使用 php 从数组值中减去数字?

c - 没有间接寻址是否可以实现子程序?

c - 在 C 中分配一个字母

java - 后缀程序的中缀。空集合异常

c++ - 是否可以在不必计算 A/B 的情况下有效地计算 A % B?

javascript - 使用另一个对象数组过滤对象数组,而不知道对象中有哪些属性

ios - 在 iOS 应用程序中使用 swift 过滤器检查 list 部分

html - 如何覆盖过滤器 :none in CSS

c - 使用 SSE4 向量化点积计算