为什么不同乐器的A音符听起来不同?

2021-03-02 09:27:58

为什么钢琴上的A音符与小提琴上的A音符不同? 如果您拉起手机上的调谐器应用程序并在钢琴上弹A音符,则调谐器将显示〜440 Hz。 用小提琴的A音符做同样的事情,您也会得到440 Hz。 我们的耳朵通过捕捉周围空气的振动频率来感知声音。 如果两种声音具有不同的频率,则它们是不同的;以同样的方式,如果两种颜色发出的波长不同,则它们看起来会有所不同。 当我们说声音为440 hz时,这意味着沿着该声波振动的点每秒完成一个完整的循环440次。 因此,根据我的调谐器应用程序,如果两个声波的频率完全相同,则它们听起来可能不会不同。 但是他们做到了! 这是否意味着除了频率以外,还有其他东西可以区分声音吗? 没有! 那就是声音-某种特定频率的空气中的振动。

调谐器在说谎吗?是的,有点:当我们说声音为440 Hz时,实际上并不是声音的完整描述。这有点像告诉您一个形状有4个点-您可能会假设它是一个正方形。但是它可以是矩形,也可以是一些完全古怪的不规则多边形。

这是我从在线虚拟乐器录制的钢琴和小提琴的音符。

将您自己的声音文件拖放到这些图中以在整个文章中使用它。

它们看起来在结构上相似,但是它们不是相同的声波。它们都具有在9毫秒内重复3次(或每秒440次)的模式。因此,这两个参数都达到了440 Hz。

但是重复的模式本身是不同的。这就是为什么说"声音是440 hz"并不是完整的描述,因此对我而言,假设(3)是一个误解。

如果扬声器以连续,规则的速度每秒精确地振动440次,则声音将是这样。

尽管它们全部都是由以440 hz重复的模式构成的,但所有这三种声音听起来都不同,这一事实告诉我,我需要调整假设(1)。我们的耳朵不会只听见空气中的一个频率。如果确实如此,那么这些声音将难以区分(我认为这实际上发生在我们的眼睛中,请参见同色异谱)。

因此,我们的耳朵可以检测到这些模式的内部结构。为了在计算机上分解此结构,我们将使用傅立叶变换。

在这种情况下,我们的信号是一个振幅列表,每个采样的声音有多响。

当您像FFT(信号)一样运行信号时,您会得到一个与频率列表相对应的列表编号。例如,如果FFT输出如下所示:

[0.001、0.1、0.7、0、12、0、2、1] [0、55、110、220、440、880、1320、1760]我们将其解释为表示440是此信号中的最高有效频率,因为它的FFT系数是12(最大),是第5个数字。而我们列表中的第五个频率是440。

我发现,将FFT的结果按照原始声音频率和相对权重放在一个表中,这样最容易解释FFT的结果(因此,我将它们全部除以最大数)。

以下是在我们的两个9 ms切片上运行的FFT结果。单击以展开所选的切片。您也可以向后滚动以手动更改切片。

这些表告诉我们,两种声音的确有最强的频率〜440 hz,但是里面也有其他频率!小提琴看起来要复杂得多,因为它似乎包含更多的重要频率。

最后一步是从该表中重建声音。用这种方式表示声音真的很强大。这是许多声音分析/转换的基础,例如:

噪音过滤?删除特定的已知频率,这就是您可以删除汽车喇叭的声音,但将声音保留在录音中的方法。

自动调谐?检查哪个音符最接近声音中的频率列表,并更改/删除/添加频率以使其听起来更接近音符。

语音识别?您可以通过将谈话作为软件可以搜索的独特模式来思考可以创建的频率。就像字母" E"在大多数英文文本中,出现的时间约为11%。我们所有人的声音中都有一些频率可以预测。

该代码返回一个可缩放原始频率的outputMultipliers数组。从这些新的频率/权重中重建出新的声音。您可以尝试将所有高频归零,或隔离单个频率。

因此,假设(3)的正确形式是:当我们说声音为440 Hz时,是指信号中权重最大的频率。要完整描述声音,您需要知道(1)它构成的所有频率,以及(2)每个频率要使用多少。

我创建此程序是为了了解FFT的工作原理。这是我一直在寻找的端到端演示,以帮助我理解它。最好在阅读其他材料时测试您的理解。我还没有源代码,但是如果您想扩展它或将其用作教学工具,请告诉我!

您可以在前两个图中拖放任何声音文件,所有图都会更新以使用它,包括FFT表和代码沙箱。这里有一些来自爱乐乐团的笔记,您可以尝试将其拖入其中:

如何从FFT输出中检索原始频率。 FFT仅以采样列表中重复的频率告诉您频率。因此,您需要乘以采样率(例如,大多数声音为44100)才能获得每秒的频率(Hz)。 JS中的大多数FFT库都没有给出频率列表(只是系数)。此处描述了用于计算哪个频率对应于哪个系数的公式。

您必须取一小部分音频。由于声音的频率会随时间变化,即使演奏单个音符,如果对整个内容进行FFT,您也不会获得准确/预期的频率。例如,钢琴音符具有" attack"和“衰减”,您想从中间切下来。请参阅短时傅立叶变换(STFT)。就像我们刚才那样,这是针对一小部分音频计算FFT,但是对所有音频片段都执行FFT。您会获得一段时间内的频率列表。通常将其可视化为频谱图。

您必须采样整数个周期。如果对任意一个纯A音符进行任意切片,除非您碰巧选择了一个与循环长度倍数匹配的开始和结束,否则您在FFT表中可能会得到大于440的结果。本文自动将任何片段缩短到最接近的周期(我们通过找到信号与Y轴交叉的最接近的样本来找出这一点)。当循环播放重建的声音时,这一点也很重要(否则您会听到爆裂的声音)。

离散傅立叶变换(DFT)不包括所有可能的频率。从理论上讲,FFT是音频中所有可能频率的连续和(AKA为整数)。我们在这里实现的是一个离散版本,其中我们对有限的频率列表求和。在很小的片中,您可能无法完全获得440作为输出,只是因为没有将其作为算法寻找的频率包含在内。我认为原则上可以有一个实现,允许您指定必须包含哪些频率(如果您知道要查找的内容),但是我还没有看到这样的实现。

FFT并不是魔术。一个流行的类比是,FFT可以提取冰沙并提取进入其中的所有成分。但这似乎是不可能的???诀窍在于,FFT会假设其中可能存在哪些频率。我们经过每个可能的频率,然后问"此声音中有440 Hz是多少?和"声音中有多少880 Hz?等等。因此,它更接近于具有未知物质,并通过检查其是否与已知化学物质/物质发生反应来确定其含义。

所有频率的总和< 1%的重量有很大的作用。我把这些隐藏在FFT表中,以为它们并不重要,而其中任何一个都不重要,但是完全删除它们确实会产生非常显着的效果。这是一个代码片段(向上滚动),可删除所有权重小于1%的频率。或尝试相反的方法,只听小于1%的体重。

高频是小提琴声音的重要组成部分。以5000 Hz或更高的频率移走任何东西,使其不再听起来像小提琴(或听起来真的很无声)。这对钢琴而言并非如此。

调至440 hz的弦将永远不会发射低于该频率的频率。由于驻波的物理原理,这是正确的,但是从理论上了解这一点,然后再回到该界面,并发现对于我所拥有的所有音符录音的确如此,这真的很酷!在我实现它之前,还不知道这一点。

以下是我在撰写本文时使用的资源列表。特别感谢Algorithm Archive Discord社区,帮助我了解了如何根据原始信号解释FFT的输出。还要感谢“更好的解释”,这对我来说是对FFT的唯一解释。

傅立叶变换的交互式指南-BetterExplained。我发现了最适合FFT的介绍。

直观的离散傅立叶变换教程-这使很多事情都点击了,就像傅立叶变换实际上在做什么,它是如何提取频率的。

这个Jupyter笔记本向我展示了如何使用Python完成本文中的所有操作。当我将其移植到网络时,它提供了很好的参考。

声纳如何运作每天更聪明的视频。没有直接关系,但是他在4:10的频谱图上有一个惊人的解释。