*自己相関を求める
音声の周波数を求めるには、自己相関が用いられることが多い。自己相関のグラフに現れる極大値の周期が、音声の周波数に該当する。
Octaveでは、xcorr() 関数を使用して、自己相関を簡単に求めることができる。
以下、音声信号SをWsサンプルずつに分割して、Wsサンプルごとに自己相関を求める関数の例
---- corrWs.m ----
function r = corrWs(S,Ws)
if(nargin == 0)
disp("usage: r = corrWs(S, Ws)");
return
end
%% if stereo, use only 1ch.
if size(S)(1,2) > 1
S = S(:,1);
endif
len = size(S)(1,1);
r = [];
for k = [1:Ws:len]
if (k+Ws-1) > len
return
end
s1=S(k:k+Ws-1);
r1 = xcorr(s1, s1, 'coeff');
r = vertcat(r, r1(1:Ws-1));
end
endfunction
----------------
【NOTE】
・xcorr() の引数に 'coeff' オプションを指定すると正規化した値が返される。xcorr() に 'coeff' 引数を指定して自己相関を求める場合には、同じ関数同士の相互相関として、引数を指定する必要がある。
・自己相関は左右対称なので、前半のみ使用している
・xcorr() の引数に 'coeff' オプションを指定すると正規化した値が返される。xcorr() に 'coeff' 引数を指定して自己相関を求める場合には、同じ関数同士の相互相関として、引数を指定する必要がある。
・自己相関は左右対称なので、前半のみ使用している
実行例:
[y, Fs] =audioread('Ongen2/egypt_charmera.wav');
Ws=1024, R=corrWs(y, Ws);
plot(R)
hold on, plot(y)
黄色:元の音声信号、青色:1024サンプルごとに区切って求めた自己相関
参考: xcorr 相互相関
0 件のコメント:
コメントを投稿