Abre MATLAB.
Genera una ventana Hamming de longitud N=600 muestras.
N=600;
v=hamming(600);
plot(v);
Carga la señal de voz: neutra15ms.wav y selecciona las 600 primeras muestras. Enventana y normaliza la señal.
[s,fs,bits]=wavread('neutra15ms.wav');
t=1:600;
sw=v.*s(t);
sw=sw/max(abs(sw));
plot(sw);
La función de MATLAB "lpc(x,p)" (help lpc) retorna los p coeficientes LPC para la senal x.
W=lpc(sw,6)
W =
Columns 1 through 6
1.0000 -2.4657 3.1342 -3.1479 2.1300 -0.7715
Column 7
0.1251
Estos coeficientes son los coeficientes del filtro blanqueador. Si filtramos
la señal con este filtro, obtendremos el error de predicción de este
modelo. Para que el modelo sea útil como predictor, queremos obtener la
señal predicha. Para ello consideraremos que el modelo da la diferencia entre
la señal real y la señal obtenida mediante el filtro predictor óptimo, cuya
salida es la señal predicha
:
est_sw = filter([0 -W(2:end)],1,sw);
e = sw - est_sw;
plot(sw);
hold on;
plot(est_sw,'r');
plot(e,'g');
En esta gráfica, la señal azul es la original, la roja la predicha, y la verde el error de predicción.
Otra manera de verlo, conociendo la dualidad modelo AR - predicción LPC, es que la salida del filtro blanqueador es la excitación del modelo AR que generó esta señal , que debería ser un ruido blanco gausiano. Podemos comprobarlo mirando su correlación.
[acs,lags] = xcorr(e,'coeff');
plot(lags,acs);
La correlación de un ruido blanco debería ser 1 en el origen (correcto) y cero en el resto de lags. Vemos que hay algunos valores bastante grandes, así que quizás el modelado AR que estamos haciendo no es suficientemente bueno. Vamos a ver que tal aproxima el modelo AR al sistema real. Para ello, recordemos que la función de transferencia del modelo AR es:
Se puede demostrar que
Por tanto, en nuestro caso
Rsw=xcorr(sw);
R=Rsw(600:606);
G=sqrt(sum(W.*R'))
G =
0.3497
Luego el módulo de HT(z) (sobre el círculo unidad) se puede calcular como:
envolvente=abs(G./fft(W,1024));
Comparemos los espectros de la señal original y del modelo AR que la representa.
SW=abs(fft(sw,1024));
semilogy(SW(1:512));
hold on;
semilogy(envolvente(1:512),'r');
hold off;
Efectivamente vemos que la predicción es mejorable. Veamos el espectro de la excitación.
E=abs(fft(e,1024));
semilogy(E(1:512));
Tampoco es exactamente un ruido blanco.
El problema es que el orden de predicción que hemos utilizado, p=6, es demasiado pequeno. Para aplicaciones de voz, se utilizan órdenes de predicción a partir de 10.
Repite todos los pasos anteriores para p=20 y para p=100.
Compara el error de predicción máximo para cada uno con el caso de p=6.
Analiza ahora un trozo de tu voz con un orden suficiente (p=20).
Compara los resultados para un tramo sonoro y uno sordo. ¿Observas diferencias?
Por último, compara los resultados variando la longitud de la ventana