如何在.Net中进行实时音高检测?

时间:2010-11-21 04:41:46

标签: c# .net vb.net signal-processing fft

我想制作一个程序来检测正在麦克风前面播放的音符。我正在测试Naudio的FFT函数,但是我用大胆的测试看起来FFT似乎没有正确检测音高。我打了一个C5,但最高的选择是在E7。

我将频率分析窗口中的第一个下拉框更改为“增强自相关”,之后最高选择位于C5。

我用谷歌搜索“增强自相关”并且没有运气。

3 个答案:

答案 0 :(得分:2)

你可能会被谐波甩掉。您是否尝试使用正弦波进行测试,看看您的NAudio的FFT是否在球场?

参见以下参考资料: http://cnx.org/content/m11714/latest/

http://www.gamedev.net/community/forums/topic.asp?topic_id=506592&whichpage=1�

Audacity源代码中的Spectrum.cpp中的第48行似乎接近您想要的内容。他们还引用了IEEE paper by Tolonen and Karjalainen

答案 1 :(得分:1)

好吧,如果你能使用GPLv2,为什么不看看Audacity的源代码呢?

http://audacity.sourceforge.net/download/beta_source

答案 2 :(得分:1)

音频频谱中的最高峰不一定是人类所感知的音高,特别是在具有强烈泛音的声音中。这是因为音调是人类的心理感知现象,大脑通常会推断出波形中甚至不存在的频率。

频率或音调估计的自动相关方法(粗略地,即使看起来有趣的和/或非正弦波形在时间上重复多远也通常是人类称之为音调的更好匹配)。自相关算法的各种增强的原因是简单的自相关将发现几乎无限数量的重复波长(例如,如果它每1秒重复一次,它也每2秒重复两次,等等。)所以诀窍是将相关性加权到不知何故,在统计上更好地匹配人类猜测相同波形的东西。