基于 LPC 系数的共振峰估计
此示例说明如何使用线性预测编码 (LPC) 来估计元音共振峰频率。共振峰频率可以通过求预测多项式的根来计算。
此示例使用语音样本 mtlb.mat
,它包含在 Signal Processing Toolbox™ 中。该语音经过低通滤波。由于采样频率低,该语音样本并不是本示例的最佳素材。低采样频率限制了可以拟合到数据的自回归模型的阶数。尽管存在这一限制,此示例仍展示了使用 LPC 系数确定元音共振峰的方法。
加载语音信号。录音内容是女声朗读的 "MATLAB®"。采样频率为 7418 Hz。
load mtlb
MAT 文件包含语音波形 mtlb
和采样频率 Fs
。
使用 spectrogram
函数识别一个浊音段进行分析。
segmentlen = 100; noverlap = 90; NFFT = 128; spectrogram(mtlb,segmentlen,noverlap,NFFT,Fs,'yaxis') title('Signal Spectrogram')
提取从 0.1 到 0.25 秒的段进行分析。提取的段大致对应于 "MATLAB" 中的第一个元音 /ae/。
dt = 1/Fs; I0 = round(0.1/dt); Iend = round(0.25/dt); x = mtlb(I0:Iend);
在线性预测编码之前,应用于语音波形的两个常见预处理步骤是加窗和预加重(高通)滤波。
使用汉明窗对语音段加窗。
x1 = x.*hamming(length(x));
应用预加重滤波器。预加重滤波器是全极点高通 (AR(1)) 滤波器。
preemph = [1 0.63]; x1 = filter(1,preemph,x1);
获得线性预测系数。要指定模型阶数,请使用一般规则,即阶数是预期共振峰数量的两倍加上 2。在频率范围 [0,|Fs|/2] 中,预期会有三个共振峰。因此,将模型阶数设置为 8。求 lpc
返回的预测多项式的根。
A = lpc(x1,8); rts = roots(A);
由于 LPC 系数是实数值,根以复共轭对组形式出现。只保留虚部具有同一符号的根,并确定与这些根对应的角。
rts = rts(imag(rts)>=0); angz = atan2(imag(rts),real(rts));
将用角表示的角频率(弧度/采样点)转换为赫兹,并计算共振峰的带宽。
共振峰的带宽由预测多项式零点到单位圆的距离表示。
[frqs,indices] = sort(angz.*(Fs/(2*pi))); bw = -1/2*(Fs/(2*pi))*log(abs(rts(indices)));
以频率大于 90 Hz 且带宽小于 400 Hz 为标准来确定共振峰。
nn = 1; for kk = 1:length(frqs) if (frqs(kk) > 90 && bw(kk) <400) formants(nn) = frqs(kk); nn = nn+1; end end formants
formants = 1×3
103 ×
0.8697 2.0265 2.7380
前三个共振峰频率为 869.70、2026.49 和 2737.95 Hz。
参考资料
[1] Snell, Roy C., and Fausto Milinazzo."Formant location from LPC analysis data."IEEE® Transactions on Speech and Audio Processing.Vol. 1, Number 2, 1993, pp. 129-134.
[2] Loizou, Philipos C."COLEA:A MATLAB Software Tool for Speech Analysis."