このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
複素ケプストラム — 基本周波数推定
この例では、複素ケプストラムを使用して話者の基本周波数を推定する方法を説明します。また、この例ではゼロクロッシング法で基本周波数を推定後、結果を比較します。
音声信号を読み込みます。録音は、女性が「MATLAB」と発声しているものです。サンプリング周波数は 7,418 Hz です。次のコードによって、音声波形 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 ~ 500 Hz に対応する時間範囲 2 ~ 10 ms を選択します。選択した範囲内のケプストラムの最も高いピークを特定します。ピークに対応する周波数を求めます。基本周波数の推定にピークを使用します。
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.