B03 ログスイープと逆フィルタ

室長:とりあえず44.1kで2秒くらいのログスイープ信号を作ってくれ。

助手:了解。コマンドラインで

glsweep 44100 0.5 10 21000 2 1 0.05 0.005 sweep44k2sec.pcm inverse44k2sec.pcm

これでサンプリング周波数44.1kHz、10Hz~21kHz、2秒間のログスイープ信号と逆フィルタが出来ました。スイープ信号の方は前後に1秒無音部分をつけたので4秒の長さになってます。これを再生できるようにwavに変換します。

sox -t f32 -r 44100 -c 1 sweep44k2sec.pcm -t wav -c 1 sweep44k2sec.wav

室長:環境によってはこのwavがうまく再生できないこともあるので、その時にはcd形式のwavファイルに変換すれば良い。あとoctaveにはwavreadという関数があるがpcmファイルを直接読み込めるように関数を作っておこう。

pcmread.m


#d = pcmread (filename)
#drc、glsweepで作られたpcmファイル(float32)を読み込む
#
function d = pcmread (filename)
  f=fopen(filename,"r","ieee-le");
  d=fread(f,Inf,"float32");
  fclose(f);
endfunction

ログスイープを読み込んで逆フィルタでインパルスに戻ることを確認しててくれ。

助手:へい。octaveで


sweep=pcmread ("sweep44k2sec.pcm");
invfilter=pcmread ("inverse44k2sec.pcm");
clf;
subplot(3,1,1);
plot(sweep);
subplot(3,1,2);
plot(invfilter);
subplot(3,1,3);
plot(fftconv(sweep,invfilter));

室長:ではログスイープと逆フィルタの周波数特性を表示してくれ。

助手:へいへい。


sweep=pcmread ("sweep44k2sec.pcm");
invfilter=pcmread ("inverse44k2sec.pcm");
clf;
hold on;
filterplot(sweep,44100,'1');
filterplot(invfilter,44100,'3');

あれ、フラットな特性では無くて高域が下がってますね。

室長:逆フィルタを通すとフラットになるので大丈夫だ。
スイープ信号のレベルを見ると低域で62dB、高域で32dBある。前回のインパルス信号では0dBしかないのでわずか2秒のスイープ信号にするだけで圧倒的にSN比が改善されるのだ。さらにSN比を良くするにはスイープ時間を長くするか、何回か測定して平均をとれば良いのだ。

助手:あとはこのスイープ信号を録音して逆特性のフィルタをかければ良いのですね。

室長:そうじゃ。具体的な方法は次回以降にまわすが、試しにノートパソコンのスピーカーを測定したデータを示そう。

この様にインパルスレスポンスが簡単に得られるのだ。

助手:へー。じゃあこの信号を再生して録音すればインパルスレスポンスが得られるんですね。ていうことはパソコンなんか使わなくてもログスイープ信号をCDに焼いて再生して、それをPCMレコーダーなんかで録音しておけば、後でパソコンに取り込んでインパルスレスポンスを計算できるのですか?

室長:まあ大体そのとおりじゃ。厳密に言うと再生と録音で同期がとれてないと測定誤差が大きくなるがの。それでは続きは次回じゃ。

2012年12月23日

次ページへ

目次へ