Java 音频分析:频率与音高
我正在设计一个简单的调谐器,所以我的目标是显示一个音符名称(a、B、F#)以及理论声音和实际输入之间的距离(以美分为单位) 我对音频和信号处理完全陌生,所以我做了一些研究,发现了一种叫做快速傅立叶变换的东西,它可以分析字节并给出频率。此外,我还发现了一些Java库,比如,所以我不会自己编写硬代码 我相信这就是全部,因为每个音域的频率可以直接映射到一个相同音律的音符,但后来我发现了一个新的(对我来说)词,叫做音高:据说它与频率密切相关,但不是完全相同的东西,更难获得,属于心理声学领域Java 音频分析:频率与音高,java,audio,signal-processing,physics,Java,Audio,Signal Processing,Physics,我正在设计一个简单的调谐器,所以我的目标是显示一个音符名称(a、B、F#)以及理论声音和实际输入之间的距离(以美分为单位) 我对音频和信号处理完全陌生,所以我做了一些研究,发现了一种叫做快速傅立叶变换的东西,它可以分析字节并给出频率。此外,我还发现了一些Java库,比如,所以我不会自己编写硬代码 我相信这就是全部,因为每个音域的频率可以直接映射到一个相同音律的音符,但后来我发现了一个新的(对我来说)词,叫做音高:据说它与频率密切相关,但不是完全相同的东西,更难获得,属于心理声学领域 所以我的问题
所以我的问题是,有人能清楚地描述出音高和频率之间的区别,并告诉我调谐器处理的是哪种调谐器吗?音高是你必须处理的标准音符。对于
A
,这是440赫兹,官方的说法,但是越来越多的音乐家和乐器开始使用它,因为这可能是441442。。。
对于编程,您最好让用户修复其标准A
(例如,让他在440和449之间,以1Hz为步长)。然后,A
一个八度以上将是880882。。。取决于用户的初始选择。
你必须以对数刻度(12个间隔)计算其他音符,最好是显示听到的频率和最近音符之间的距离。
参见此示例:是波每秒经过的振荡次数。任何周期性的波都有一个频率。但通常在音乐中,这个词的使用仅限于谈论正弦波,所以如果你听到某个频率为x的波,它通常意味着一个每秒有那么多振荡的正弦波
任何任意波,无论周期与否,都可以通过将不同频率的正弦波以不同的量(即具有不同振幅)相加来构造。傅里叶变换的作用是告诉你使用哪个频率,用哪个振幅来产生任何给定的波。快速傅里叶变换(FFT)是一种特殊的算法,它计算波的傅里叶变换,给定表示波振幅随时间变化的数据
当你听到乐器演奏的音符时,它不仅仅由单一频率组成。相反,你得到的是一个基频的不同倍数的组合,数量不同。例如,吹奏特定音符的长笛可能会产生以下组合:
- 440赫兹,振幅为1
- 1320 Hz,振幅为1/2
- 2200 Hz,振幅为1/3
- 440赫兹,振幅为1
- 880 Hz,振幅为1/2
- 1320 Hz,振幅为1/4
- 1760 Hz,振幅为1/8
幸运的是,如果你只是制作一个简单的调谐器,你根本不用担心音高。调谐器的目的是最小化不同乐器之间的节拍,而节拍是由实际频率而不是感知的音调引起的。基频为440 Hz的小号和长笛不会显示节拍,因为它们所有频率之间的差异都是440 Hz的倍数,即使未经训练的耳朵可能认为其中一个音调比另一个高。音调与信号的周期性有关。的确,它是基于心理声学的,但是当我们听到一个音调时,可以非常准确地说我们检测到了信号的伪周期性 频谱是将音频信号分解为各种频率的正弦和余弦之和。正如David指出的,通常当人们在音乐环境中谈论“频率”时,他们指的是你将信号分解成的这些正弦波的频率。所以频谱是看这些正弦分量中哪一个是大的,它们的频率是多少。频谱广泛地代表了你戴着高帽听到的“高频”,以及你在岩石撞击地面时听到的“低频”。严格地说,这两种声音都不是周期性的,你也感觉不到音调,但你听到的是频谱中高频和低频部分的相对大小 傅里叶变换(或DFT/FFT)是一种数学算法,通过它可以将音频信号分解为正弦和余弦之和。所以通过观察这些正弦和余弦的大小,你可以得到频谱。猜测音高的一种简单方法是直接观察一小段音频的频谱,并假设信号的最大正弦分量对应于其基本周期性 我在另一篇文章中写了一个很长的答案,我认为这将回答你关于如何提取音高的问题: