2011-03-04 34 views
0

我有一个相当有趣的问题需要解决。比较简单的声音 - 什么是最接近的频率

我想要拍一个非常简单的声音(钢琴上演奏的一个音符)并尝试处理它,以便我可以打印出最有可能播放的音符。

从一些谷歌搜索和搜索我遇到了快速傅里叶变换,但我不完全知道我将如何使用它来分析数据从一个WAV文件。

我的另一个想法是,每次播放时音符应该差不多一样。如果情况是这样的话,两个wav文件变成字节数组的百分比匹配是否有用?

想法和想法将不胜感激。

回答

2

与比较两个WAV相比,FFT是一个更好的选择。 FFT将产生一个频谱,并且由于钢琴产生相对纯净的音色,因此当您绘制它时,您会观察到非常不同的尖峰。每个尖峰的位置表示波形的组成频率之一,最大尖峰代表音符。

+0

是的,这样你就可以确定两个声音中的每一个的基本频率。由于钢琴,麦克风等的缺陷,这两个频率可能略有不同,因此您无法直接比较它们。相反,建立所有可能的钢琴键的音高([这里是如何])(http://en.wikipedia.org/wiki/Equal_temperament#Twelve-tone_equal_temperament))并将你的两个频率调整到最近的钢琴键频率。如果他们对齐到相同的频率,则弹奏相同的钢琴键。 – 2011-03-04 12:36:23

+0

要构建可能的钢琴音高,您需要知道钢琴是如何调音的 - 您需要知道它的参考音高。这是在上面的链接解释。在实践中,你的应用程序不会知道这个,所以你应该假设它是440Hz。 – 2011-03-04 12:37:30

+0

啊,谢谢。请让我看看我现在是否理解正确:我可以将我的信号转换到频域(我已使用accord.net完成了这项工作)。在frequecy域中,我可以绘制Y轴上的功率图和X轴上的频率图。最大的峰值是音符的频率。所以我可以从轴读取音符的频率,并检查它最接近的钢琴音符。 – Nyx 2011-03-06 08:24:08

0

您应该分析正在播放的音符的频率。我有点生疏,但我认为FFT应该这样做,因为它会将波形分解为频谱。

您不希望将wav文件与已存储的wav文件进行比较,因为周期振幅等可能不同。 “百分比匹配”会产生错误的结果。

一旦掌握了波形的频率,就可以设计出正在播放的音符。

0

我会开始阅读数字信号处理(DSP)和频谱分析。听起来就像你试图找到钢琴音符的基本频率

要使用WAV或其他文件格式进行任何有意义的工作,您需要提取和解释音频样本。如果不想手动这样做,我建议您查看大量现有的DSP库。我不确定什么好的C#库存在。

快速傅里叶变换(FFT)将基本上将您的功率在时域转换到频域,从本质上为您的音频添加一个z轴。