B17 位相を揃える

室長:今回は位相を揃えてみよう。位相を揃えると言っても大きく分けて2つの方針が考えられる。

1.左右の特性を揃えるために最小限の補正をする。
2.左右のスピーカーをそれぞれ理想的な特性に補正する。その結果左右の特性も揃う。

助手:どちらが良いのですか?

室長:どちらが良いかはスピーカーや測定環境で変わるかもしれん。断言できるほどの経験は持ち合わせていないのでな。

助手:ではやり方を簡単に説明してください。

室長:方法は簡単だ。feqzで測定したデータをh、目標特性をh1とすればh1./hが補正フィルタとなる。この場合は位相と周波数特性が同時に補正される。周波数特性だけ補正するには複素数の角度を変えずに大きさだけ変えれば良い。
abs(h1./h)
反対に周波数特性を変えずに位相だけ補正したければ大きさを1にすれば良い。
h1./h./abs(h1./h)

左右の特性を揃えるには目標特性を左右の平均にすればよい。インパルスレスポンスを補正するには目標特性を1にすれば良いのだ。

助手:後はこれを逆fftすれば良いのですね。

室長:うむ。だがこれでは逆に音質が低下するのだ。細かい補正は百害あって一利なしだ。位相も周波数特性も平滑化して細かい補正はしないで大体の特性を合わせた方が好結果が得られる。どの程度平滑化するかは難しいので各自聴感できめてほしい。まあ今回はやり方の説明と言うことで平滑化なしでいく。

ではhを逆fftして波形に戻す関数を作ってくれ。

助手:ifftにかけるだけではダメですか?

室長:freqz関数は指定しなければfftしたfs/2以下だけを返しているのだ。のこりの半分、fs/2からfsまでを作ってからifftするのだ。fs/2を中心に左右対称、ただし複素数は共役複素数にする必要がある。

助手:こんな感じですか?

mifft.m

#a=mifft(h)
#fs/2以下の周波数特性 h(複素数)をifftして波形に戻す
#
function a=mifft(h)
  a=flipud(h);
  a=conj(a);
  b=abs(h(length(h)));
  a=[h;b;a(1:length(h)-1)];
  a=ifft(a);
  a=real(a);
endfunction

室長:ではやってみてくれ。

助手:測定した結果hから補正フィルタを作ってみます。1./hを波形に戻します。


h2=1./h;
a=mifft(h2);
plot(a);

室長:fftshift関数で波形を中心に持ってきてくれ。

助手:こうですか?


a=fftshift(a);
plot(a);

室長:周波数がfs/2まで補正するようになっているからかなり無茶な波形になってる。実際には必要な帯域だけ補正するようにするのだ。さらに必要な部分を切り取って窓関数をかければ出来上がりと言うわけだ。まあとりあえず補正フィルタを通すと波形がどうなるか見てくれ。

助手:はーい。

補正前

補正後

ひぇー、全然違う波形になっちゃいましたよ。

室長:うむ、firフィルタをつかえばかなり無理な補正もできる。だが音質を考えたら最小限の補正ですますようにする方が良いのだ。

さて、次回はタイムアライメントを調整しよう。

2013年1月29日

次へ

目次へ