音频分析:频率与音调

Raf*_*ele 5 java audio physics signal-processing

我正在设计一个简单的调谐器,所以我的目标是显示一个音符名称(A,B,F#)和理论声音与实际输入之间的距离.

我对音频和信号处理完全陌生,所以我做了一些研究,我找到了一个名为快速傅立叶变换的东西,它将分析字节并给出频率.此外,我发现了一些Java库,如常见的数学JTransforms,因此我不会自己编写硬代码.

我相信这一切,因为每个范围频率可以直接映射到平等气质的音符,但后来我发现这个新的(对我来说)单词称为音高:它被认为与频率紧密相关,但并不完全相同事情并且要难得多,属于那个心理声学领域.

所以我的问题是,有人可以清楚地概述音高和频率之间的差异,也许可以告诉我哪个调谐器处理?

Dav*_*d Z 15

频率只是波每秒经过的振荡次数.任何周期性的波都有一个频率.但通常在音乐中,使用该术语仅限于谈论正弦波,所以如果你听到有关频率x的波动,它通常意味着每秒钟有很多振荡的正弦波.

任何波,无论是周期性的还是非周期性的,都可以通过将不同频率的不同频率的正弦波(即具有不同幅度)相加来构建.傅立叶变换的作用是告诉您使用哪些频率以及使用哪些幅度来创建任何给定的波.快速傅立叶变换(FFT)是计算波的傅里叶变换的特定算法,给定表示作为时间的函数的波的幅度的数据.

当您听到乐器演奏的音符时,它不仅包含一个频率.相反,你得到的是不同数量的基频不同倍数的组合.例如,演奏特定音符的长笛可能会产生组合

  • 440 Hz,幅度为1
  • 1320 Hz,幅度1/2
  • 2200 Hz,幅度为1/3

等等.另一方面,演奏相同音符的小号可能会产生组合

  • 440 Hz,幅度为1
  • 880 Hz,幅度1/2
  • 1320 Hz,幅度为1/4
  • 1760 Hz,幅度为1/8

等等.(那些不是这些乐器的实际相对振幅;我只是编写了一些示例数字)所以在您的调谐器应用中,当您对输入数据运行FFT时,您会在不同频率的输出中找到多个峰值,具体取决于哪个仪器正在调整.关键是FFT的输出不仅仅是一个数字; 它不会只是告诉你"这个乐器正以440赫兹的速度播放音符."

现在我们进行投球,这是一个稍微模糊的概念.音符的音高基本上是一个人在接触到音符时实际听到的音符.对于许多乐器,音高与乐器发出的基频相关.但是,根据较高频率的相对幅度,一个人可能会感觉到两个乐器具有不同的音高,即使它们实际上正在播放相同音符.

幸运的是,如果你只是制作一个简单的调音器,你根本不必担心音调.调谐器的要点是最小化不同乐器之间的节拍,并且节拍是由实际频率引起的,而不是由感知到的音高引起的.小音和长笛都以440赫兹的基频播放,不会出现节拍,因为它们所有频率之间的差异是440赫兹的倍数,即使未经训练的耳朵可能认为其中一个比另一个更高音.

  • 为了澄清,我应该补充一点,FFT根本不会给你频率的幅度,而是能量 - 每个*带*.要获得峰值频谱,您需要在频段之间进行插值以估算各个分量的幅度.即使这样,最低或最强的分量也不一定对应于基频.谷歌:"F0估计". (3认同)

Jer*_*wen 5

音高是关于信号的周期性.确实,它是基于心理声学的,但是当我们听到音调时我们正在检测信号的伪周期是非常准确的.

频谱是将音频信号分解为各种频率的正弦和余弦之和.正如大卫所指出的那样,通常当人们在音乐环境中谈论"频率"时,他们指的是这些正弦波的频率,你打破了信号.因此,频谱正在研究这些正弦分量中的哪一个很大,以及它们处于什么频率.光谱广泛地代表你在高帽中听到的"高频率",以及你在岩石撞击地面时听到的"低频率".严格来说,这些声音都不是周期性的,你也不会感知音高,但你听到的是频谱的高频和低频部分的相对大小

傅里叶变换(或DFT/FFT)是一种数学算法,通过它您可以将音频信号分解为正弦和余弦的总和.因此,通过查看从FFT中获得的这些正弦和余弦的大小,您将得到频谱.一种猜测音高的天真方式是直接观察一小段音频的频谱,并假设信号的最大正弦分量对应于其基本周期性.

我在另一篇文章中写了一篇很长的答案,我认为它会回答你如何提取音调的问题:https://stackoverflow.com/a/7211695/94102 我强烈建议你阅读它.它将为您提供制作高质量调谐器所需的工具和理解.