Cepstrum complejo: estimación de la frecuencia fundamental
Este ejemplo muestra cómo estimar la frecuencia fundamental de un orador utilizando el cepstrum complejo. El ejemplo también estima la frecuencia fundamental utilizando un método de cruce por cero y compara los resultados.
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. El siguiente código carga la forma de onda de voz, mtlb
, y la frecuencia de muestreo, Fs
, al espacio de trabajo de MATLAB®.
load mtlb
Utilice el espectrograma para identificar un segmento con voz para su análisis.
segmentlen = 100;
noverlap = 90;
NFFT = 128;
spectrogram(mtlb,segmentlen,noverlap,NFFT,Fs,'yaxis')
Extraiga el segmento desde 0.1 hasta 0.25 segundos para su análisis. El segmento extraído corresponde aproximadamente a la primera vocal, /æ/, de "MATLAB".
dt = 1/Fs; I0 = round(0.1/dt); Iend = round(0.25/dt); x = mtlb(I0:Iend);
Obtenga el cepstrum complejo.
c = cceps(x);
Seleccione un rango temporal entre 2 y 10 ms que corresponde a un rango de frecuencia de aproximadamente 100 a 500 Hz. Identifique el pico más alto del cepstrum en el rango seleccionado. Encuentre la frecuencia correspondiente al pico. Utilice el pico como estimación de la frecuencia fundamental.
t = 0:dt:length(x)*dt-dt;
trng = t(t>=2e-3 & t<=10e-3);
crng = c(t>=2e-3 & t<=10e-3);
[~,I] = max(crng);
fprintf('Complex cepstrum F0 estimate is %3.2f Hz.\n',1/trng(I))
Complex cepstrum F0 estimate is 239.29 Hz.
Represente el cepstrum en el rango temporal seleccionado y superponga el pico.
plot(trng*1e3,crng) xlabel('ms') hold on plot(trng(I)*1e3,crng(I),'o') hold off
Utilice la función zerocrossrate
en una forma de la vocal rectificada y a la que se ha aplicado un filtro paso bajo para estimar la frecuencia fundamental.
[b0,a0] = butter(2,325/(Fs/2));
xin = abs(x);
xin = filter(b0,a0,xin);
xin = xin-mean(xin);
zc = zerocrossrate(xin);
F0 = 0.5*Fs*zc;
fprintf('Zero-crossing F0 estimate is %3.2f Hz.\n',F0)
Zero-crossing F0 estimate is 234.94 Hz.