我知道这个答案不会让每个人都开心,但是就这样吧。
这东西很难,非常难。首先阅读尽可能多的关于 FFT、自相关、小波的教程。尽管我仍在为 DSP 苦苦挣扎,但我确实从以下内容中获得了一些见解。
https://www.coursera.org/course/audio课程目前没有运行,但视频仍然可用。
http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf关于音高识别算法开发的论文。
http://dsp.stackexchange.com一个专门用于数字信号处理的网站。
如果像我一样,你没有做足够的数学来完全遵循教程不要放弃,因为一些图表和示例仍然帮助我理解发生了什么。
接下来是测试数据和测试。为自己编写一个库,生成用于检查算法的测试文件。
1)一个超级简单的纯正弦波发生器。因此,假设您正在考虑编写 YAT(Yet Another Tuner),然后使用您的正弦发生器创建一系列大约 440Hz 的文件,例如从 420-460Hz 以不同的增量,看看您的代码有多灵敏和准确。它可以解析到 5Hz、1Hz 甚至更精细吗?
2)然后升级您的正弦波发生器,以便为信号添加一系列较弱的谐波。
3)接下来是谐波的真实世界变化。因此,对于大多数弦乐器,您会看到一系列谐波是基频 F0 的简单倍数,但对于单簧管和长笛等乐器,由于室内空气的行为方式,偶次谐波将丢失或非常微弱。对于某些仪器,F0 缺失,但可以从其他谐波的分布中确定。F0 是人耳感知的音高。
4)通过以不规则的方式上下移动谐波峰值频率来引发一些故意的失真
关键是,如果您正在创建具有已知结果的文件,那么更容易验证您正在构建的内容是否确实有效,当然还有错误。
还有许多包含声音样本的“库”。
https://freesound.org来自上述 Coursera 系列。
http://theremin.music.uiowa.edu/MIS.html
接下来请注意,您的麦克风并不完美,除非您花费数千美元购买它,否则它将具有相当可变的频率响应范围。特别是如果您使用的是低音,那么便宜的麦克风,阅读您的 PC 或手机中的内置麦克风,从 80-100Hz 左右开始会有显着的衰减。对于相当好的外部设备,您可能会降至 30-40Hz。去找你麦克风上的数据。
您还可以通过扬声器播放音调然后用您最喜欢的麦克风录音来检查发生了什么。但当然,现在我们谈论的是 2 组频率响应曲线。
在性能方面,有许多免费可用的库,但请注意各种许可模型。
最重要的是不要在你的前几次尝试后放弃。祝你好运。