我的担忧是,当查看频率域图时,aurioTouch似乎并没有真正很好地工作。我在乐器上演奏一个音符,但我没有看到一个有序、小的一组频率,只有一个适当频率的字符串峰值。
有人使用过aurioTouch足够了解底层代码是否可行,还是它只是一个粗糙的示例?
我有其他选择,可以使用FFTW或KISS FFT。有人对此有任何经验吗?
谢谢。
无论库是否正确生成它,你都在寻找一种在现实声音中很少存在的模式。只有一个完美的正弦波,通过电子方式产生,才会在频率图中产生均匀的离散“尖峰”。如果你不相信,请在Winamp或媒体播放器中启动“频谱分析器”可视化工具。这与PC无关。
在你的脑海中想象一个锯齿形或方波。那些波浪上的急转弯或点,对于FFT或甚至是真正的傅里叶来说,看起来就像是许多更高的谐波。如果你曾经在示波器上看到过真正的“方波/锯齿形”,或者甚至是一个仪器产生的“正弦波”,你会发现在一个音符中有所有尖锐的角落和缝隙(如果你没有示波器,只需在Audacity中放大波形 - 放大得越多,你所看到的高音就越多)。没错,这些偏差都算作频率。
有时在频谱分析中,很难区分一个音符和整个管弦乐队之间的差异。
那么耳朵是如何做到的呢?它考虑了整个波形。然后你的低级大脑欺骗你的高级大脑,告诉它输入的是一个音符,而不是一堆泛音。
你无法完全做到这一点,但可以通过“训练”来近似。
在乐器上演奏音符并“保存”频率图。对于几个频率范围的音符或更好地说所有音符都要这样做。
然后通过将该乐器的保存图表乘以2^(1/12)(或1/24用于1/4步)来插值填充音符的差距。
找出如何将它们存储在快速可搜索的数据结构(如BST或trie)中。只需返回“这有多接近”的得分即可识别匹配项。如果以不同的音量录入,则还必须根据频率比例进行识别匹配。
下次你寻找该乐器的音符时,只需取出“听到”的频率图并在该数据结构中找到它。你可以记录几个制造不同波形的乐器并搜索它们。如果有背景声音或多个音符,请选择最接近的匹配项。然后,如果你想识别其他音符,请从采样的频率模式中“减去”找到的频率模式,反复操作。
快速傅里叶变换(FFT)使用频率区间,区间的宽度基于FFT参数。要找到一个频率,您需要以至少是样本中最高频率两倍的速率对其进行采样。然后找到周期之间的时间。如果它不是纯频率,这当然会更难。
我正在使用Ooura FFT计算加速度计数据的FFT。但我并不总是得到正确的频谱。由于某种原因,Ooura FFT会产生完全错误的结果,其频谱幅值在所有频率上都达到10^200的数量级。