Main Content

Estimación de formantes con coeficientes LPC

Este ejemplo muestra cómo estimar frecuencias formantes de vocales utilizando codificación predictiva lineal (LPC). Las frecuencias formantes se obtienen encontrando las raíces del polinomio de predicción.

Este ejemplo utiliza la muestra de voz mtlb.mat, que es parte de Signal Processing Toolbox™. Se ha aplicado un filtro paso bajo a la voz. Debido a la baja frecuencia de muestreo, esta muestra de voz no es óptima para este ejemplo. La baja frecuencia de muestreo limita el orden del modelo autorregresivo que puede ajustar a los datos. Pese a esta limitación, el ejemplo ilustra la técnica para utilizar coeficientes LPC para determinar formantes de vocales.

Cargue la señal de voz. Se trata de una grabación de una mujer diciendo "MATLAB®". La frecuencia de muestreo es 7.418 Hz.

load mtlb

El archivo MAT contiene la forma de onda de voz, mtlb, y la frecuencia de muestreo, Fs.

Utilice la función spectrogram para identificar un segmento con voz para su análisis.

segmentlen = 100;
noverlap = 90;
NFFT = 128;

spectrogram(mtlb,segmentlen,noverlap,NFFT,Fs,'yaxis')
title('Signal Spectrogram')

Figure contains an axes object. The axes object with title Signal Spectrogram contains an object of type image.

Extraiga el segmento desde 0.1 hasta 0.25 segundos para su análisis. El segmento extraído corresponde aproximadamente a la primera vocal, /ae/, de "MATLAB".

dt = 1/Fs;
I0 = round(0.1/dt);
Iend = round(0.25/dt);
x = mtlb(I0:Iend);

Dos pasos de preprocesamiento habituales que se aplican a las formas de onda de voz antes de la codificación predictiva lineal son el enventanado y el filtrado de preénfasis (paso alto).

Enventanee el segmento de voz utilizando una ventana Hamming.

x1 = x.*hamming(length(x));

Aplique un filtro de preénfasis. El filtro de preénfasis es un filtro (AR(1)) paso alto de todos los polos.

preemph = [1 0.63];
x1 = filter(1,preemph,x1);

Obtenga los coeficientes de predicción lineal. Para especificar el orden de modelo, utilice la norma general de que el orden es dos veces el número previsto de formantes más 2. En el rango de frecuencia, [0,|Fs|/2], se esperan tres formantes. Por lo tanto, establezca el orden de modelo igual a 8. Encuentre las raíces del polinomio de predicción que devuelve lpc.

A = lpc(x1,8);
rts = roots(A);

Puesto que los coeficientes LPC son de valor real, las raíces tienen lugar en pares complejos conjugados. Mantenga solo las raíces con un signo para la parte imaginaria y determine los ángulos que corresponden a las raíces.

rts = rts(imag(rts)>=0);
angz = atan2(imag(rts),real(rts));

Convierta las frecuencias angulares en rad/muestra representadas por los ángulos a hercios y calcule los anchos de banda de los formantes.

Los anchos de banda de los formantes se representan mediante la distancia de los ceros del polinomio de predicción desde el círculo de la unidad.

[frqs,indices] = sort(angz.*(Fs/(2*pi)));
bw = -1/2*(Fs/(2*pi))*log(abs(rts(indices)));

Utilice el criterio de que las frecuencias de formantes deben ser mayores que 90 Hz con anchos de banda menores que 400 Hz para determinar los formantes.

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

Los primeros tres formantes son 869,70, 2.026,49 y 2.737,95 Hz.

Referencias

[1] Snell, Roy C. y Fausto Milinazzo. Formant location from LPC analysis data. IEEE® Transactions on Speech and Audio Processing. Vol. 1, número 2, 1993, págs. 129-134.

[2] Loizou, Philipos C. COLEA: A MATLAB Software Tool for Speech Analysis.