我最近问了this question :
我正在寻找一种检测音高的算法。其中一个答案建议我使用初始 FFT 来获得基本频率响应,找出哪些频率被发声,然后在每个感兴趣的区域使用带通滤波器进行跟进:
A slightly advanced algorithm could do something like this:
- Roughly detect pitch frequency (could be done with DFT).
- Bandpass signal to filter isolate pitch frequency.
- 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/