B07 反射と高調波歪

室長:わかりやすい部屋の反射からゆくぞ。もとのスイープ信号に反射音を付け加えたデータを作ってみてくれ。さらにそれに逆フィルタをかけてインパルスに戻してくれ。

助手:これは簡単、距離差が1mだとするとサンプリング周波数が44100Hz、音速340mとすると約130サンプル遅らせます。さらに元の波形を-10dbくらいにして加算すれば出来上がりです。


a=pcmread("sweep44k2sec.pcm");
a2=[zeros(130,1) ; a(1:length(a)-130)];
a2=a2*db2a(-10);
a=a.+a2;
b=pcmread("inverse44k2sec.pcm");
c=fftconv(a,b);
clf;
plot(a);
figure;
plot(c);


室長:では次にスイープ波形に2次高調波を加えた波形を作ってくれ。ヒント:ログスイープの周波数は指数的に増加するぞ。

助手:えーと、これはちょっと面倒ですね。もとの2倍の周波数の波形を作って加算すれば良いのですよね。そもそも元の波形は10Hzから21kHzまでを2秒でスイープするように作ったはずです。てことは元の信号は2秒間で周波数が2100倍になる。周波数が2倍になるのにかかる時間は log(2)/log(2100) * 2 秒ですね。つまり0.18122秒毎に周波数が倍になっていきます。
わかりました。スイープ信号を0.18122秒、約7991サンプル早めて、早めた7991サンプルをカットして加算すればどの時間でも元の2倍の周波数になります。あれれ、時間を早めるってことは….逆フィルタをかけるとインパルスの前に歪み成分がでるってことです!

a=pcmread("sweep44k2sec.pcm");
a2=[a(7992:length(a)) ; zeros(7991,1)]; #7991サンプルずらす
a2(1:44100)=0; #はみ出た部分をゼロに(無音部分は1秒)
a2=a2*db2a(-20); #-20dB
a=a.+a2;
b=pcmread("inverse44k2sec.pcm");
c=fftconv(a,b);
clf;
plot(a);
figure;
plot(c);


室長:その通りじゃ。3次高調波ならばもとのスイープ信号で周波数が3倍になる時間だけまえに出るぞ。

このようにインパルスレスポンスを測定するだけで部屋の反射を除いた特性、反射こみの特性、高調波歪みが一発で分かるのじゃ。その他にウォーターフォール特性とかいろんな事ができるので興味があればやってみるがよい。

2012年12月27日

次ページへ

目次へ