Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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')

Figure contains an axes object. The axes object with xlabel Time (ms), ylabel Frequency (kHz) 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, /æ/, 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

Figure contains an axes object. The axes object with xlabel ms contains 2 objects of type line. One or more of the lines displays its values using only markers

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.

Consulte también

| |