比较简单的声音 - 最接近的频率是多少

Posted

技术标签:

【中文标题】比较简单的声音 - 最接近的频率是多少【英文标题】:Comparing Simple Sounds - What is the Closest Frequency 【发布时间】:2011-03-04 11:06:20 【问题描述】:

我有一个相当有趣的问题要解决。

我想获取一个非常简单的声音(钢琴上弹奏的一个音符)并尝试以这样的方式处理它,以便我可以打印出最有可能弹奏的音符。

通过一些谷歌搜索和搜索,我发现了快速傅立叶变换,但我不完全确定如何使用它来分析 wav 文件中的数据。

我的另一个想法是,每次播放的音符都应该或多或少相同。如果是这种情况,将两个 wav 文件转换为字节数组的百分比匹配是否有用?

我们将不胜感激。

【问题讨论】:

【参考方案1】:

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

【讨论】:

是的,这样您就可以确定两种声音中每一种的基频。由于钢琴、麦克风等方面的缺陷,这两个频率可能略有不同,因此您无法直接比较它们。相反,为所有可能的钢琴键构建音高 (here's how) 并将您的两个频率捕捉到最近的钢琴键频率。如果它们捕捉到相同的频率,则弹奏的是相同的钢琴键。 要构建可能的钢琴音高,您需要知道钢琴是如何调音的——您需要知道它的参考音高。上面的链接中对此进行了解释。实际上,您的应用不会知道这一点,因此您应该假设它是 440Hz。 啊,谢谢。请让我看看我现在理解是否正确:我可以将我的信号转换为频域(我已经使用accord.net 完成了此操作)。在频域中,我可以绘制一个图表,其中 Y 轴为功率,X 轴为频率。最大的尖峰是音符的频率。所以我可以从轴上读取音符的频率,并检查它最接近钢琴上的哪个音符。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

快速傅立叶变换 (FFT) 实质上会将您在时域上的功率转换为频域,实质上是为您的音频添加一个 z 轴。

【讨论】:

以上是关于比较简单的声音 - 最接近的频率是多少的主要内容,如果未能解决你的问题,请参考以下文章

单一频率的声音怎么弄?

如何用delphi实现扬声器发出一定频率的声音

HDMI的I2C频率能到多少

DSP方法检测在当前声音中可能不是最主要的特定频率

声音合成:使用 AS3 在频率之间插值

FFT算法得到错误的声音频率值