ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

複素ケプストラム -- 基本周波数推定

この例では、複素ケプストラムを使用して話者の基本周波数を推定する方法を説明します。また、この例ではゼロクロッシング法で基本周波数を推定後、結果を比較します。

音声信号を読み込みます。録音は、女性が「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

ローパスフィルター処理が行われ、整流された母音の波形において、ゼロクロッシング検出器を使用して基本周波数を推定します。

[b0,a0]=butter(2,325/(Fs/2));
xin = abs(x);
xin = filter(b0,a0,xin);
xin = xin-mean(xin);
x2 = zeros(length(xin),1);
x2(1:length(x)-1) = xin(2:length(x));
zc=length(find((xin>0 & x2<0) | (xin<0 & x2>0)));
F0=0.5*Fs*zc/length(x);
fprintf('Zero-crossing F0 estimate is %3.2f Hz.\n',F0)
Zero-crossing F0 estimate is 233.27 Hz.

複素ケプストラムを使用して求められた基本周波数の推定値は 239.29 Hz、ゼロクロッシング検出器を使用して求められた推定値は 233.27 Hz です。

この情報は役に立ちましたか?