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 的结果,与窗口函数的选取有关。