Main Content

基于 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."