音频分析:频率与音调

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在一个音高上演奏单个音符的乐器可以在音符的持续时间内产生许多频率的声学振动。

这是因为乐器不是正弦波发生器。 相反产生的复杂(和更有趣的声音)波形可以表示为许多不同幅度的正弦和余弦波的叠加复合,即“频率”。

这些许多频谱频率通常是音调频率的谐波,有时是音调频率的精确倍数,但有时对于大弦乐器而言略微不和谐,对于某些类型的打击乐器而言非常不和谐,以及音符瞬变。

在调整乐器时,音乐家通常只关心音高。 他们对所有谐波的频率不感兴趣(除了第一个),即使是最响亮的谐波。 这些谐波可以是显示为FFT幅度中最高峰值的频率。 对于某些音乐声音,音调频率可能会显示为许多频率峰值中最小的一个,或者可能根本不显示,这使得频率选择可能容易出错。

相反,音高估计算法试图挑选人类将感知为音乐音调的基本(伪)重复周期,无论该周期的倒数是否是声谱中最强的频率分量。

FFT可以用作频率估计器的一部分。 仅仅使用FFT峰值幅度结果是一个非常差的频率估计器,没有适当的大小,窗口,插值和可能某种决策机制。 但即使是好的频率估计器也不是音高估计器。

音高估计器可以使用FFT作为其分析的一部分,但除了FFT之外或代替FFT,通常使用自相关,倒谱,声码器,模式匹配,决策理论和相关算法。

摘要:调谐器应该处理音调,并忽略频谱频率,除非结果是音调分析或音调估计的相关组件。

音高是您必须接近的标准音符。 对于A ,这是440赫兹,正式,但越来越多的音乐家和乐器正在倾向于它,因为这可能是441,442,…对于编程,你最好让用户修复它的标准A (让例如,他走到440和449之间,步长为1赫兹)。 然后, A八度音阶将是880,882 ……取决于用户的初始选择。 您必须以对数刻度(按十二个间隔)计算其他音符,最好的是显示所听到的频率与最近音符之间的距离。 请参阅此示例: http : //members.efn.org/~qehn/global/building/cents.htm

正如其他人所说,音乐“音调”,例如由长笛演奏的A4音符,由许多音频“频率”组成,即440 Hz的基本A4音调和许多泛音(也称为谐波)。

泛音是基音的整数倍。 在这个例子中,基音是440赫兹,泛音是880,1320,1760赫兹,依此类推。

通过观察几种乐器的实际频谱,您将更好地理解音高和频率之间的关系。

您可以在此处查看频谱: 乐器频谱

当您使用上述工具查看乐器谱时,您正在查看FFT(快速傅里叶变换)的输出。 FFT用于处理由乐器产生的数字录制的声音。

FFT将乐器的音频信号从时间/声音 – 压力域变换到频率/频率 – 幅度域。

除了“正常”正频率的幅度之外,FFT还自动产生“负频率”的幅度。 这里不需要讨论,但只能看到“正常”的正频率,点击“Un-Fold w”按钮。

上面的工具以分贝为单位显示FFT幅度(默认情况下)。 分贝是“正常”线性幅度的拉伸版本。 分贝图可让您在同一图表上看到非常大且非常小的幅度。

如果只想查看幅度最大的频率,请单击“FFT Y轴幅度”菜单,然后在菜单顶部选择“Sqrt(R ^ 2 + I ^ 2)”。

要返回分贝图,请在同一菜单中选择“dB Norm Sqrt(R ^ 2 + I ^ 2)”。

单击“播放”按钮可听到所选乐器的录制声音,播放所选音符。

单击“Inv-FFT”按钮可查看为所选仪器和音符记录的时间/声音 – 压力信号。

顺便说一句,Inv-FFT执行实际的逆FFT。 它实际上合成了来自frequency / frequency_magnitude数据的原始时间/声音 – 压力信号。

单击“FFT”按钮再次查看光谱。

使用放大和缩小按钮选择缩放模式。 然后在要放大或缩小的图形部分周围拖出一个框。 再次单击缩放按钮可返回unzoomed模式。

对于您的调谐器,您必须:

  1. 用FFT处理输入信号(仪器声音)。
  2. 检测基本峰值。
  3. 确定峰值与所需音高的距离,例如A4的440 Hz。
  4. 显示用户的差异。

你会遇到的问题:

  1. 输入信号中的背景噪声。
  2. 用户的乐器严重失调(坏乐器)。
  3. 用户试图调和弦而不是单个音符(坏用户)。

重要的是要注意振动的“频率”和音乐“音调”之间的差异。

“音调”不是单个振动,例如正弦波,而是在不同的数学相关频率下发生的多个声音振动的合成 。 这种不同频率的振动合成元素被称为谐波或部分。 例如,如果我们按下钢琴上的中间C键,复合波的谐波的各个频率将以261.6 Hz开始作为基频,523 Hz将是2次谐波,785 Hz将是3次谐波,1046 Hz将是后谐波是基频的整数倍,261.6 Hz(例如:2 x 261.6 = 523,3 x 261.6 = 785,4 x 261.6 = 1046)。

下面是复调MP3录音中吉他独奏3秒的对数DFT图像。 它显示了在演奏独奏时吉他上各个音符的谐波是如何出现的。 对于此对数DFT上的每个音符,我们可以看到它的多个谐波垂直延伸,因为每个谐波将具有相同的时间宽度。 ( 点击查看对数DFT图片 )

这篇维基百科的文章给出了与音乐有关的“音调”概念的良好背景,并介绍了一些关于音高检测的概念。

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

音高和频率测量的数量完全相同,但在不同的尺度上。

频率通常以赫兹为单位,其计算振动物体经历完整振动周期的每秒的次数。 例如,如果频率为440赫兹,则物体每秒经历440个完整的振动周期。

音高通常以八度音,半音和美分来衡量 – 一分为半音的1/100,半音是八度的1/12。 它通常不表示为数字量,而是表示为字母和符号。 这是因为对于音高而言,没有“零点”。

因为音高和频率测量相同的东西,你可以在它们之间自由转换 – 而不是像华氏温度和摄氏温度表示的温度转换。 算法有点复杂 – 为了计算音高,你需要在频率的基数2对数和对应于已知音高的频率的基数2对数之间取差异。 这个已知音高最常用的值是“A高于中等C” – 它对应于恰好440赫兹的频率。

通过示例可以最好地演示此转换。 假设我想找到对应于1000赫兹频率的音高。 基数为2的对数为9.9657842847。 440的基数2对数是8.7813597135。 差异是1.1844245711; 这告诉我,对应于1000赫兹的音高是“A中间C以上”的1.1844245711个音高。 乘以12乘以半音的答案 – 它是14.21309485半音。 现在14个半音以上“A高于中间C”是“B”,比中间C高出近2个八度。因此我们寻找的音高比这个“B”高21.309485美分。

字母名称有点令人困惑,因为有时你会上升2个半音来到下一个字母(所以B是A上面的2个半音),有时只有1个(所以C是B上的1个半音)。 他们也重复每个八度音阶(因此G上面的2个半音不是H,它是A)。 音乐家发现这很容易处理; 我们其他人发现它非常令人困惑。

现在,当您在乐器上演奏单个音符时,您获得的声波具有多个频率,您可以通过傅立叶分析找到它们。 最低频率称为“基频”,其他频率通常是该频率的整数倍(称为“谐波”或“泛音”)。 所以,如果你在钢琴上演奏“A above C”,你会得到一个复合声音,由440Hz的频率,880Hz的频率,1320Hz的频率等组成 – 可能有几十个这样的声音构成声音的各个频率,所有这些都是440Hz的整数倍。 现在大多数听这个的音乐家都不会区分每个频率的单个声音,所以当音乐家使用“音调”这个词时,他们通常指的是基频的音高(“A高于中等C”),因为那是唯一可以区分的音高。

如果你正在构建一个调谐器,这就是你想要使用的“音调”的定义; 也就是说,你的调音器应该只显示听到声音的音乐家才能真正区分的音高。 这意味着在完成傅里叶分析后,您需要在计算音高之前删除这些较高的频率。 我想(但我不确定这一部分),一旦你从傅立叶分析中获得了一组频率,你就需要删除任何频率

  • 是集合中较低频率的整数倍,或非常接近整数倍
  • 具有明显低于较低频率的幅度 – 但我不确定幅度必须低多少,然后较高的音调消失为不可听见性(并且它可能在听众之间变化)。

再举一个例子,假设我的声音包括262Hz,440Hz,524Hz,786Hz,880Hz,1048Hz和1320Hz的频率,并且每个频率的幅度远大于上述频率的幅度。 我注意到所有频率都是262Hz或440Hz的倍数。 所以我得出结论,这个声音只有两个“基本频率”,因此只包括两个音符,或者仅仅两个音高(大致在中间C和上面的A)。 较高的音高当然是声音的组成部分,但它们是谐波。 听到声音的人听不到谐波; 因此,您的调谐器不应显示。

在这种程度上,音乐家所感知的音调是心理效应,这使得难以在电子调谐器中进行建模。 您可能需要进行一些实验,以确定何时应将较高音调视为单独音符,何时应将其视为谐波。 此外,许多音乐家将能够听到傅立叶分析没有拾取的音高(总和音调和差异音调) – 他们的听力确实会发挥作用。