是否有一个程序可以确定音频文件中的最高音调?


14

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

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

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

Answers:


13

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

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

library(tuneR)
library(seewave)

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

w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")

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

fpeaks(meanspec(w), nmax=1)

结果:

数值结果:

fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859

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

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

最好的选择是通过查看滑动时间窗口上的频率峰值来进行主导频率分析,并检查最高频率出现在哪里。

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

你可以用

s = specprop(meanspec(w, from=10, to=11)) 

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

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

w = downsample(w, 16000)

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

您也可以寻找音高检测软件。像这样,尽管需要MATLAB。


顺便说一句,而不是fpeaks,您是否知道是否有一个函数绘制频率与时间的关系图?
Pacerier 2012年

查看我的更新。这不是那么简单。我对音频的了解还不是很多,但是很抱歉,周围是否还有更好的东西。
slhck 2012年

8

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

屏幕截图

请注意,与MP3版本相比,使用MP3版本的文件可获得不同的结果,因为MP3压缩改变了波形并引入了失真/混叠。

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


嗯,它似乎不适用于文件Piano.mp3。对我来说,它显示10121 Hz(D#9)screenshoot.me/uZZ2N0,但这不太可能,因为钢琴上的最大琴键是C8(4186Hz)。我做错了什么吗?
Pacerier 2012年

3
@Pacerier不,但是您改变了一下问题。狗哨声样本易于识别,因为频谱中具有最高峰值的频率也是最高频率,同时也是主要音符。对于音乐,最高频率不一定是最高音符,因为乐器演奏的音符由多个频率组成。
slhck 2012年

@slhck IC,我认为我们可以猜测的说明,如果我们有频率,貌似也不是那么简单..
Pacerier

@Pacerier:如果将Size设置为更高的值,我相信它可以给出更精确的结果并消除一些谐波。
詹姆士·P

2
@Pacerier不,确实不是那么简单。基音检测要求您先将波形转换为频谱(快速傅立叶变换),然后再应用滤波器(主要是低通),再应用另一轮滤波器。除非您找到随时间变化来跟踪音高的工具,否则您要寻找的东西真的很难。您可以研究Melodyne等人声校正工具。
slhck 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.