共振峰与F0

先前听歌开着频谱看的时候,注意到音高变化的时候,泛音也会跟着变化,我想当然的认为泛音就是共振峰,要根据共振峰区分元音,还需要确定其与F0的关系。
泛音频率随F0变化
这个错误一直直到高数学了傅里叶展开,才让我意识到,也许泛音不是因为共振引起的加强或减弱,而是由激励源本身引起的谐波,即:泛音并不是共振峰,共振峰与F0无关。
如果泛音不是共振峰,那共振峰又是什么?激励波形是什么波,才会引起这样的谐波组成?这是本文要探讨的主题。

共振峰是什么

共振峰指的是频谱上能量相对集中的一些区域。

单独看这句定义,很容易产生“频谱上的峰值就是共振峰”这种错觉,从而认为上图中频谱图的每个泛音都是一个共振峰。但是实际上,共振峰指的是频谱的包络线相对于激励波的加强或减弱。也就是说,共振峰实际上描述的是声道结构所形成的滤波器的频率响应特征。频谱中的泛音不是共振峰,是激励波形的谐波。

从谐波组成推测激励波形

选取样本音频一段相对稳定的语音,进行FFT分析,得到如图结果:
样本音频的谐波组成
容易注意到,该段语音的谐波均为整数次(F1=2F0、F2=3F0、F3=4F0……),因此不是简单的三角波或是方波的频域分解特征。
既然反向推测无效,那么就根据已知的频谱分布去写傅里叶级数,然后绘图查看函数来辅助正向猜测。
根据频谱分布猜测傅里叶展开式绘图
这个图形看起来非常像反锯齿波:
添加作为参考的反锯齿波绘图
也就是说,语音的激励波形很可能是反锯齿波或者是类反锯齿波。

那么,反向验证一下:
使用软件生成一段反锯齿波音调,频率为262Hz:
生成262Hz(C4)的反锯齿波  
然后使用参数滤波器叠加上600、1100、3200、3600Hz四个共振峰:
设置参数滤波器模拟共振峰因素的影响
应用参数滤波器后的效果
能够听到一个非常机械的男声在唱“啊”。因此验证了使用反锯齿波模拟声带的激励波形是可取的。
【文件】人工合成的“啊”声样本

共振峰到底代表了什么

我们知道,共振峰与元音的类型有关,一般通过F1、F2、F3足以分辨大部分元音,部分元音还需要结合F4、F5判断。但是如果共振峰与且仅与元音有关,那说话人的音色分辨是如何实现的?一个人改变他说话的F0时,我们并不会认为这个人声音很不一样,只会感觉他的声音音高有变化。也就是说,F0在合理的范围内变化时,不太会影响说话人的音色分辨。那么还有什么能够让人区分不同人的声音呢?也许是共振峰,也许是泛音组成。这些还有待进一步探究。