你期待错了!!
不是图书馆的错
无论库是否正确生成它,您都在寻找一种在现实生活中很少实际存在的模式。只有电子产生的完美正弦波才会导致频率中出现甚至部分离散的“尖峰”。图形。如果您不相信它,请尝试在 winamp 或媒体播放器中启动“频谱分析器”可视化。这不是PC的错。
真正的声波是复杂的动物
在你的脑海中想象一个锯齿波或方波。那些急转弯 - 波上的拐角或点,对于 FFT 甚至是真正的傅立叶来说,看起来像是大量的高次谐波。如果您曾经在示波器上看到过真正的“方波/锯齿波”,或者甚至是由应该产生正弦波的仪器产生的“正弦波”,那么请看看刚才的所有尖角和缝隙一个音符(如果您没有示波器,请大胆地放大波浪 - 放大得越多,您看到的音符就越高)。是的,这些偏差都算作频率。
有时在频谱分析中很难区分一个音符和整个管弦乐队之间的区别。
但我听到的是单音!
那么耳朵是怎么做到的呢?它考虑了整个波形。然后你的下脑就输入的内容向你的上脑撒谎:一个音符,而不是一堆泛音。
你不能完全做到这一点,但你可以通过“训练”来近似它。
近似:建立一些智能
在仪器上播放音符并“保存”频率图。对几个频率范围内的音符执行此操作,或者更好的是所有音符。
然后通过将保存的图表乘以 2^(1/12)(或 1/24 为 1/4 步等)来插入音符以填补空白(以 1/2 或 1/4 步长)。
弄清楚如何将它们存储在可快速搜索的数据结构中,例如 BST 或 trie。只有它必须返回“这个分数有多接近”。它还必须通过频率比例来识别匹配,以防它以不同的数量出现。
使用智能
下次您要从该乐器中查找音符时,只需获取“听到的”频率图并在该数据结构中找到它。您可以记录几种产生不同波形的仪器并搜索它们。如果有背景声音或多个音符,请选择最接近的匹配。然后,如果您想识别其他音符,请从采样的音符中“减去”找到的频率模式,然后冲洗,重复泡沫。
用你的声音是不行的...
如果你曾经试图通过对着吉他调音器唱歌来给自己调音,你就会知道调音器并没有那么聪明。当然,有些乐器(尤其是人声)确实会在音高上浮动并产生不断变化的波形(即使没有人唱歌)。
你想达到什么目的?
对于“简单”的调谐器应用程序,您不必完全花哨,但如果您不只是制作另一个调谐器应用程序,我猜您实际上想要识别音符(例如,也许您想从收音机里的歌曲;-)
祝你好运。我希望你能找到一个可以处理所有这些垃圾的库,而不必自己动手。
编辑 2017
请注意这个网页:http :
//www.feilding.net/sfuad/musi3012-01/html/lectures/015_instruments_II.htm 在页面下方,有各种风琴管的频谱分析。有很多很多的泛音。如果你先用它们“训练”你的应用程序,这些是可以检测到的 - 如果你先用它们“训练”你的应用程序(就像告诉孩子,'这就是单簧管听起来的样子......')