用于识别间距的.NET库

Ant*_*oni 28 .net c# signal-processing frequency-analysis

我想写一个简单的程序(最好是在C#中),我用麦克风唱一个音高,程序识别音高对应的音符.


非常感谢您的及时回复.我澄清一下:

我想要一个(最好是.NET)库来识别我唱的音符.我想要这样一个图书馆:

  1. 我唱歌时识别音符(半音音符).
  2. 告诉我,我离最近的音符有多远.

我打算用这样一个库一次唱一个音符.

Jas*_*yon 20

这个问题的关键部分是快速傅立叶变换.该算法将波形(您的唱歌音符)转换为频率分布.计算完FFT后,您可以识别基频(通常是FFT中幅度最高的频率,但这在某种程度上取决于您的麦克风的频率响应曲线以及您的麦克风正在收听的确切类型的声音).

一旦找到基频,就需要在将频率映射到音符的列表中查找该频率.在这里你需要处理它们之间(所以如果你的唱歌音符的基频是452Hz,它实际上会响应什么音符,A或A#?).

CodeProject上的这个人在C#中有一个FFT的例子.我确定那里有其他人......


end*_*ith 8

您正在寻找频率估计音高检测算法.大多数人建议找到FFT的最大值,但这过于简单,并且不像您想象的那样有效.如果缺少基波(例如定音鼓),或者其中一个谐波大于基波(例如小号),它将无法检测到正确的频率.小号谱:

小号谱http://www.eng.cam.ac.uk/DesignOffice/mdp/electric_web/AC/02284.jpg

此外,如果您只查找特定频率,则会浪费处理器周期来计算FFT.您可以使用Goertzel算法等功能更有效地查找特定频段的音调.

你真的需要找到"第一个显着频率"或"具有强谐波分量的第一个频率",这比找到最大值更加模糊.

自相关谐波的产品范围是在寻找真正的乐器真实的根本好转,但如果该仪器是不和谐(大部分是),那么波形随时间变化的,我怀疑它不会工作,以及如果你尝试一次测量超过几个周期,这会降低您的准确性.


Sva*_*nte 7

您通常会对输入进行傅里叶变换,然后确定最突出的频率.这可能不是整个故事,因为任何非合成声源都会产生许多频率(它们构成所谓的"音色").无论如何,它可以有效地完成; 有实时自动调节器(你不相信流行音乐明星可以唱歌,你呢?).