복소 켑스트럼 — 기본주파수 추정
이 예제에서는 복소 켑스트럼을 사용하여 화자의 기본주파수를 추정하는 방법을 보여줍니다. 이 예제에서는 또한 영점교차 방법을 사용하여 기본주파수를 추정하고 이를 결과와 비교합니다.
음성 신호를 불러옵니다. 이 음성 신호는 한 여성이 "MATLAB"이라고 말한 것을 녹음한 것입니다. 샘플링 주파수는 7418Hz입니다. 다음 코드는 음성 파형 mtlb
와 샘플링 주파수 Fs
를 MATLAB® 작업 공간으로 불러옵니다.
load mtlb
스펙트로그램을 사용하여, 분석할 음성 세그먼트를 식별합니다.
segmentlen = 100;
noverlap = 90;
NFFT = 128;
spectrogram(mtlb,segmentlen,noverlap,NFFT,Fs,'yaxis')
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
저역통과 필터를 적용하여 정류된 형태의 모음에 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.