我正在设计一个简单的调谐器,所以我的目标是在理论声音和实际输入之间以美分显示音符名称(A,B,F#)和距离。
我对音频和信号处理完全陌生,所以我做了一些研究,我找到了一个名为快速傅里叶变换的事物,它将分析字节并给出频率。另外,我找到了几个Java库,如common math和JTransforms,所以我不会自己编写硬代码。
我相信这一切,因为每个范围频率可以直接映射到平等气质的音符,但后来我发现这个新的(对我来说)单词叫做 pitch :据说是紧的与频率有关,但并不完全相同,而且更难获得,属于心理声学区域。
所以我的问题是,有人可以清楚地概述音高和频率之间的差异,也许可以告诉我哪个调谐器处理?
答案 0 :(得分:15)
Frequency只是波每秒经过的振荡次数。任何周期性的波都有一个频率。但通常在音乐中,使用该术语仅限于谈论正弦波,所以如果你听到一些频率为x的波,它通常意味着每秒钟有很多振荡的正弦波。
任何波,无论是否是周期性波,都可以通过将不同频率的不同频率的正弦波(即具有不同幅度)相加来构建。傅立叶变换的作用是告诉您使用哪些频率以及使用哪些幅度来创建任何给定的波。快速傅里叶变换(FFT)是一种特殊的算法,它计算波的傅里叶变换,给定数据表示波的幅度随时间的变化。
当您听到乐器演奏的音符时,它不仅包含一个频率。相反,你得到的是不同数量的基频不同倍数的组合。例如,演奏特定音符的长笛可能会产生
的组合等等。另一方面,演奏相同音符的小号可能会产生
的组合等等。 (那些不是这些乐器的实际相对振幅;我只是编写了一些示例数字)所以在您的调谐器应用中,当您对输入数据运行FFT时,您会在不同频率的输出中找到多个峰值,具体取决于哪个仪器正在调整。关键是FFT的输出不仅仅是一个数字;它不会只是告诉你“这个乐器正在以440赫兹的速度播放音符。”
现在我们来到pitch,这是一个稍微模糊的概念。音符的音高基本上是一个人在接触到音符时实际听到的音符。对于许多乐器,音高与乐器发出的基频相关。但是根据较高频率的相对幅度,一个人可能会感觉到两种乐器具有不同的音高,即使它们实际上是在播放相同音符。
幸运的是,如果你只是制作一个简单的调音器,你根本不必担心音调。调谐器的要点是最小化不同乐器之间的节拍,并且节拍是由实际频率引起的,而不是由感知到的音高引起的。小号和长笛都以440赫兹的基频播放,不会出现节拍,因为它们所有频率之间的差异是440赫兹的倍数,即使未经训练的耳朵可能认为其中一个比另一个更高音。 / p>
答案 1 :(得分:5)
音高是关于信号的周期性。确实,它是基于心理声学的,但是当我们听到音调时我们正在检测信号的伪周期是非常准确的。
频谱是将音频信号分解为各种频率的正弦和余弦之和。正如大卫所指出的那样,通常当人们在音乐环境中谈论“频率”时,他们指的是这些正弦波的频率,你打破了信号。因此,频谱正在研究这些正弦分量中的哪一个很大,以及它们处于什么频率。光谱广泛地代表你在高帽中听到的“高频率”,以及你在岩石撞击地面时听到的“低频率”。严格来说,这些声音都不是周期性的,你也不会感知音高,但你所听到的是频谱的高频和低频部分的相对大小
傅里叶变换(或DFT / FFT)是一种数学算法,通过它您可以将音频信号分解为正弦和余弦的总和。因此,通过查看从FFT中获得的这些正弦和余弦的幅度,您将得到频谱。猜测音高的一种天真的方法是直接观察短音频的频谱,并假设信号的最大正弦分量对应于其基本周期性。
我在另一篇文章中写了一篇很长的答案,我认为它会回答你如何提取音高的问题:https://stackoverflow.com/a/7211695/94102我强烈建议阅读它。它将为您提供制作高质量调谐器所需的工具和理解。
答案 2 :(得分:2)
在一个音高上演奏单个音符的乐器可以在音符持续时间内产生许多频率的声学振动。
这是因为乐器不是正弦波发生器。相反产生的复杂(和更有趣的声音)波形可以表示为许多不同幅度的正弦和余弦波的叠加复合,即“频率”。
这些频谱频率通常是音调频率的谐波,有时是音高频率的精确倍数,但有时对于大弦乐器而言略微不和谐,对于某些类型的打击乐器而言非常不谐音,以及音符瞬态。
在调整乐器时,音乐家通常只关心音高。他们对所有谐波的频率不感兴趣(除了第一个),即使是最响亮的谐波。这些谐波可以是显示为FFT幅度中最高峰值的频率。对于某些音乐声音,音调频率可能会显示为许多频率峰值中最小的频率之一,或者可能根本不显示,这使得频率选择可能容易出错。
相反,音高估计算法试图挑选出人类会感知为音高的基本(伪)重复周期,无论该周期的倒数是否是声谱中最强的频率成分。 / p>FFT可用作频率估算器的一部分。仅仅使用FFT峰值幅度结果是一个非常差的频率估计器,没有适当的大小,窗口,插值和可能某种决策机制。但即使是好的频率估算器也不是音高估计器。
音高估计器可以使用FFT作为其分析的一部分,但除了FFT之外,还经常使用自相关,倒谱,声码器,模式匹配,决策理论和相关算法。
总结:调音器应该处理音调,并忽略频谱频率,除非结果是音调分析或音高估计的相关部分。
答案 3 :(得分:1)
音高是您必须接近的标准音符。对于A
,这是正确的440赫兹,但越来越多的音乐家和乐器正在抚养它,因为这可能是441,442,......
对于编程,您最好让用户修复其标准A
(让他在440和449之间,例如,步长为1 Hz)。然后A
一个八度音阶将是880,882 ......取决于用户的初始选择。
您必须以对数刻度(按十二个间隔)计算其他音符,最好的是显示所听到的频率与最近音符之间的距离。
请参阅此示例:http://members.efn.org/~qehn/global/building/cents.htm
答案 4 :(得分:1)
正如其他人所说,音乐“音调”,例如长笛演奏的A4音符,由许多音频“频率”组成,即440 Hz的基本A4音调和许多泛音(也称为谐波。)
泛音是基调的整数倍。在此示例中,基音为440 Hz,泛音为880,1320,1760 Hz等。
通过观察几种乐器的实际频谱,你会更好地理解音高和频率之间的关系。
您可以在此处查看频谱:Musical instrument spectrum
使用上述工具查看乐器谱时,您正在查看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模式。
对于你的调音师,你必须:
您将遇到的问题:
答案 5 :(得分:1)
重要的是要注意振动的“频率”和音乐“音调”之间的差异。
“音调”不是单个振动,例如正弦波,而是在不同的数学相关频率下发生的多个声音振动的复合。这种不同频率的振动合成元素被称为谐波或部分。例如,如果我们按下钢琴上的中间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上的每个音符,我们可以看到它的多个谐波垂直延伸,因为每个谐波将具有相同的时间宽度。 (click for image of Logarithmic DFT)
这篇维基百科文章提供了与音乐有关的“音调”概念的良好背景,并介绍了有关音高检测的一些概念。
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
答案 6 :(得分:-1)
音高和频率测量的数量完全相同,但在不同的音阶上。
频率通常以赫兹为单位计算,它计算振动物体在整个振动周期内每秒的次数。例如,如果频率为440赫兹,则物体每秒经历440个完整的振动周期。
音高通常以八度音,半音和美分来衡量 - 一分为半音的1/100,半音是八度的1/12。它通常不表示为数字量,而是表示为字母和符号。这是因为没有"零点"因此,对于球场。
因为音高和频率测量相同的东西,你可以在它们之间自由转换 - 而不是像华氏温度和摄氏温度表示的温度转换。算法有点复杂 - 为了计算音高,你需要在频率的基数2对数和对应于已知音高的频率的基数2对数之间取差异。这个已知音高最常用的值是" A高于中等C" - 它对应的频率恰好为440赫兹。
通过示例可以最好地演示此转换。假设我想找到对应于1000赫兹频率的音高。基数为2的对数为9.9657842847。 440的基数2对数是8.7813597135。差异是1.1844245711;这告诉我对应于1000赫兹的音高是1.1844245711以上的八度音阶" A高于中音C"。乘以12乘以半音的答案 - 它是14.21309485半音。现在14个半音以上#34; A高于中音C"是" B"比中间C高出近2个八度。因此,我们正在寻找的音高是高于这个" B" 21.30。
字母名称有点令人困惑,因为有时你上升2个半音来到下一个字母(所以B是A上面的2个半音),有时只有1个(因此C是B上方的1个半音)。它们也重复每个八度音程(因此G上面有2个半音不是H,它是A)。音乐家发现这很容易处理;我们其他人发现它非常令人困惑。
现在,当您在乐器上演奏单个音符时,您获得的声波具有多个频率,您可以通过傅立叶分析找到它们。最低频率称为"基频",其他频率通常是该频率的整数倍(称为"谐波"或"泛音")。所以,如果你玩#34; A高于中等C"在钢琴上,你会得到一个复合声音,由440Hz的频率,880Hz的频率,1320Hz的频率等组成 - 可能有几十个单独的频率组成你的声音,所有其中440Hz的整数倍。现在大多数听这个的音乐家都不会为每个频率区分各个声音,所以当一个音乐家使用“" pitch"”这个词时,他们通常会指的是基频的音高(") #34; A中间的C"),因为它是唯一可以区分的音高。
如果你正在建立一个调谐器,这就是" pitch"的定义。你想要使用;也就是说,你的调音器应该只显示听到声音的音乐家才能真正区分的音高。这意味着在完成傅立叶分析后,您需要在计算音高之前删除这些较高的频率。我想(但我不确定这一部分),一旦你从傅立叶分析中获得了一组频率,你就需要删除任何频率
再举一个例子,假设我的声音包括262Hz,440Hz,524Hz,786Hz,880Hz,1048Hz和1320Hz的频率,并且每个频率的幅度远大于上述频率的幅度。我注意到所有频率都是262Hz或440Hz的倍数。所以我得出结论,这个声音只有两个基本频率"因此只包括两个音符,或者只有两个音符(大致在中间的C和上面的A)。较高的音高当然是声音的组成部分,但它们是谐波。听到声音的人听不到谐波;因此不应由您的调谐器显示。
在这种程度上,音乐家所感知的音调是一种心理效应,这使得很难在电子调音器中进行模拟。您可能需要进行一些实验,以确定何时应将较高音高视为单独音符,何时应将其视为谐波。此外,许多音乐家将能够听到傅里叶分析没有发现的音高(总和音调和差异音调) - 他们的听力确实起到了诡计。