Main Content

DCT para compresión de señal de voz

Este ejemplo muestra cómo comprimir una señal de voz usando la transformación discreta del coseno (DCT).

Cargue un archivo que contenga la palabra "fuerte", pronunciada por una mujer y por un hombre. Las señales se muestrean a 8 kHz.

load(fullfile(matlabroot,'examples','signal','strong.mat'))  % To hear, type soundsc(her,fs), pause(1), soundsc(him,fs)

Utilice la transformación discreta del coseno para comprimir la señal de voz femenina. Descomponer la señal en vectores base DCT. Hay tantos términos en la descomposición como muestras en la señal. Los coeficientes de expansión en vectormidan cuánta energía se almacena en cada uno de los componentes.X Ordene los coeficientes de mayor a menor.

x = her';  X = dct(x);  [XX,ind] = sort(abs(X),'descend');

Encuentre cuántos coeficientes DCT representan el 99,9% de la energía en la señal. Exprese el número como un porcentaje del total.

need = 1; while norm(X(ind(1:need)))/norm(X)<0.999    need = need+1; end  xpc = need/length(X)*100;

Establece en cero los coeficientes que contienen el 0,1% restante de la energía. Reconstruya la señal a partir de la representación comprimida. Trazar la señal original, su reconstrucción y la diferencia entre los dos.

X(ind(need+1:end)) = 0; xx = idct(X);  plot([x;xx;x-xx]') legend('Original',[int2str(xpc) '% of coeffs.'],'Difference', ...        'Location','best')

 % To hear, type soundsc(x,fs), pause(1), soundsc(xx,fs)

Repita el análisis para la voz masculina. Encuentre cuántos coeficientes DCT representan el 99,9% de la energía y exprese el número como un porcentaje del total.

y = him'; Y = dct(y);  [YY,ind] = sort(abs(Y),'descend');  need = 1; while norm(Y(ind(1:need)))/norm(Y)<0.999    need = need+1; end  ypc = need/length(Y)*100;

Establezca el resto de los coeficientes en cero y reconstruya la señal a partir de la versión comprimida. Trazar la señal original, su reconstrucción y la diferencia entre los dos.

Y(ind(need+1:end)) = 0; yy = idct(Y);  plot([y;yy;y-yy]') legend('Original',[int2str(ypc) '% of coeffs.'],'Difference', ...        'Location','best')

 % To hear, type soundsc(y,fs), pause(1), soundsc(yy,fs)

En ambos casos, aproximadamente la mitad de los coeficientes DCT son suficientes para reconstruir la señal de voz razonablemente. Si la fracción de energía requerida es del 99%, el número de coeficientes necesarios se reduce a aproximadamente el 20% del total. La reconstrucción resultante es inferior pero todavía inteligible.

El análisis de estas y otras muestras sugiere que se necesitan más coeficientes para caracterizar la voz del hombre que la de la mujer.

Consulte también

|