将音频文件的 Spectral Frequency( Spectrogram)转化为 Spectral Pitch 的算法是什么?

2015-07-29 03:20:33 +08:00
 sydneyzh

用adobe audition生成的图
Spectral Frequency vs Time
http://m1.yea.im/1Ba.png

Spectral Pitch vs Time
http://m1.yea.im/1Bb.png

图示是巴赫G弦咏叹调的最开头,只有小提琴和钢琴伴奏两个音部。

我以为调子pitch 和 frequency 是一一对应的关系,但为什么调子分量能被提取出来?

2269 次点击
所在节点    问与答
2 条回复
Futura
2015-07-29 05:02:05 +08:00
append说的不对,fft做的声谱本来就是实时截取一秒内的有限点做的
zhuang
2015-07-29 09:13:14 +08:00
这种由 spectrum 获取 frequency 的行为对应的数学描述是傅里叶变换,时域和频域转换,应用在音频采样上就是离散傅里叶变换(Discrete Fourier Transformation)。实际应用中的算法叫做快速傅里叶变换即 FFT。


一个 Pitch 通常包含一个最低的 base frequency,同时有多个更高频率的 overtones。求 pitch 的重点在这个最低的频率上面。(印象中这是根据人类心理声学模型得出的结论,同等功率的低频和高频信号,低频信号的心理感知强度更大。)

傅里叶变换的结果是频域函数,求 pitch 还需要对信号做分解。





至于为什么可以获得 pitch 信息,或者说如何获得 pitch 信息,下面是解释。数字信号这部分忘得差不多了,所以可能有不对的地方。


声音模拟信号经过采样和量化之后,存储方式一般都是 Amplitude - Time 形式,比如 PCM 格式。(主要是方便持久化和根据数字信号重建模拟信号)

而频率随时间会变化,根据要获取某一时刻的频率(比如 pitch)的精度,可以确定相对应的采样时长,window 函数负责将原始信号截取为各个独立的采样区间。

解析精度 frequency resolution 由信号的采样率和窗口采样数决定,比如 44.1kHz 的信号,用 8 采样的窗口,只能获得 44.1/8=5.5Hz 的解析精度,即无法分辨频率相差小于 5.5Hz 的信号。

此时的采样时长为 8/44.1=0.18s,提高采样窗口可以提高频率的分辨率,但也会增加采样时长,对于变化快的信号,采样的准确性也会下降。

还是以 5.5Hz 解析精度为例,离散傅里叶变换的结果是离散的映射关系:
F(0) 的值代表 0~2.75 Hz 信号的强度
F(1) 的值代表 2.75~8.25 Hz 信号的强度
F(2) 的值代表 13.75~19.25 Hz 信号的强度
以此类推。

如何确定 pitch 实际上是人为找到一个标准,是找 F(n) 强度尽量大的,还是找 n 尽量小的,甚至还要考虑心理声学模型的修正。不过对于“歌曲识别”之类的应用场景来说无所谓,只要前后标准一致就好了。





第二张图里某些时刻的 pitch 对应多个值,形成了竖线,我猜大概是 spectral leakage 的结果,与窗口函数的选取有关。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/209082

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX