Main Content

복소 켑스트럼 — 기본주파수 추정

이 예제에서는 복소 켑스트럼을 사용하여 화자의 기본주파수를 추정하는 방법을 보여줍니다. 이 예제에서는 또한 영점교차 방법을 사용하여 기본주파수를 추정하고 이를 결과와 비교합니다.

음성 신호를 불러옵니다. 이 음성 신호는 한 여성이 "MATLAB"이라고 말한 것을 녹음한 것입니다. 샘플링 주파수는 7418Hz입니다. 다음 코드는 음성 파형 mtlb와 샘플링 주파수 Fs를 MATLAB® 작업 공간으로 불러옵니다.

load mtlb

스펙트로그램을 사용하여, 분석할 음성 세그먼트를 식별합니다.

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.

0.1초~0.25초의 세그먼트를 분석용으로 추출합니다. 추출되는 세그먼트는 대략 "MATLAB"의 첫 번째 모음 /æ/에 해당합니다.

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

복소 켑스트럼을 구합니다.

c = cceps(x);

대략 100~500Hz의 주파수 범위에 해당하는 2~10ms의 시간 범위를 선택합니다. 선택한 범위에서 켑스트럼의 가장 높은 피크를 식별합니다. 피크에 대응되는 주파수를 구합니다. 피크를 기본주파수의 추정값으로 사용합니다.

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.

선택한 시간 범위에서 켑스트럼을 플로팅하고 그 위에 피크를 표시합니다.

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

저역통과 필터를 적용하여 정류된 형태의 모음에 zerocrossrate 함수를 사용하여 기본주파수를 추정합니다.

[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.

참고 항목

| |