有没有程序可以确定音频文件中的最高音高?

Pac*_*ier 14 audio windows

是否有 Windows 程序可以确定音频文件(例如 mp3 文件)中的“最高声波频率”?

例如,它应该能够分析文件Dog-Whistle-0并确定在文件中找到的最高频率大约为 ~12000 Hz。

此外,它应该能够分析Piano.mp3并确定最高音符。

slh*_*hck 13

R是跨平台和免费/开源的。

加载它,并加载tuneRseewave库(如果尚未安装,请从包管理器安装它们)。

library(tuneR)
library(seewave)
Run Code Online (Sandbox Code Playgroud)

然后,加载您的 MP3 或 WAV 文件:

w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")
Run Code Online (Sandbox Code Playgroud)

现在,让我们绘制频谱及其峰值:

fpeaks(meanspec(w), nmax=1)
Run Code Online (Sandbox Code Playgroud)

结果:

数值结果:

fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859
Run Code Online (Sandbox Code Playgroud)

以上仅适用于非音乐数据。当您分析音乐的频率时,您会发现最高频率始终在 12-20 kHz 左右,具体取决于所涉及的乐器。但是,这个最高频率不会为您提供正在播放的音符的估计值,因为当由乐器演奏时,一个音符将由多个频率组成。

这就是乐器的所谓“音色”,您会发现,与电吉他演奏的 A 相比,长笛演奏的 440 Hz 的 A 将包含不同的频率分量。

最好的办法是通过查看滑动时间窗口上的频率峰值来运行主频率分析,并检查最高峰值出现的位置。

但是,没有“频率随时间变化”这样的东西。您只能在某些滑动时间窗口上绘制平均(或主要)频率。Seewave 提供了很多关于选择时间窗口的功能,但它变得相当复杂。

你可以用

s = specprop(meanspec(w, from=10, to=11)) 
Run Code Online (Sandbox Code Playgroud)

获取 10 到 11 秒的频谱属性,然后调用s$centroids$mean获取该特定时间窗口的质心或平均频率(尽管 1 秒对于音频分析来说相当大)。

如果您的 Wave 文件使用 44.1 kHz 采样,您可以对其进行下采样以减少计算工作量,例如降低到 16 kHz。

w = downsample(w, 16000)
Run Code Online (Sandbox Code Playgroud)

但请记住,根据奈奎斯特定理,现在可以表示的最大频率是 8 kHz。

您还可以寻找音高检测软件。像this one,虽然需要MATLAB。


Jam*_*s P 8

你试过Audacity吗?它是一个免费软件工具,具有一些相当复杂的分析工具,包括一个Plot Spectrum命令,可从Analyze -> Plot Spectrum... 访问

截屏

请注意,与 WAV 版本相比,文件的 MP3 版本会得到不同的结果,因为 MP3 压缩改变了波形并引入了伪影/混叠。

编辑:您链接到的那些声音文件不是很好的例子。更高频率的文件仅以 44.1KHz 采样,这是为人类听觉量身定制的(最大约 20KHz)。不增加采样率就无法表示超声波频率。

  • @Pacerier 不,但你稍微改变了你的问题。狗哨样本很容易识别,因为频谱中具有最高峰值的频率也是最高频率,同时也是主导音符。对于音乐而言,最高频率不一定是最高音符,因为乐器演奏的音符是由多个频率组成的。 (3认同)
  • @Pacerier 不,它真的没有那么简单。音高检测要求您首先将波形转换为频谱(快速傅立叶变换),然后应用滤波器(主要是低通),然后再进行一轮滤波器。除非您找到一种可以随时间跟踪音高的工具,否则您要寻找的东西真的很难。您可以研究 [Melodyne](http://www.celemony.com/cms/index.php?id=products_editor) 等人声校正工具。 (2认同)