今回は、前回掛けたリバーブの特性を詳しく見てみます。
もしリバーブの伝達特性が数式で表せれば、scilab で計算すればいいので簡単ですが、そんな式は見たこともありません。非常に複雑でデジタル処理でリアルタイムで掛けようとすると大変な演算になるというのは聞いています。
そこで前回と同様、何か参照信号を入れてその結果から類推する、という方法を取ります。
複雑な波形では何を見ているのか分からなくなりますが、正弦波を入れてもあまり期待できないような気がするので、伝達特性を測るための基本と云われているインパルス信号を入力してみることにします。
インパルス信号は理想的には作ることができませんが(時間幅無限小、時間x高さ=1)、そこそこ長い時間の中で一つパルスを入れてみるということで仮の実現をさせてみます。
生成スクリプトは以下のようです。1 x 32768 のゼロ行列を作って、2 番目のデータを 0.5 にするだけです。
[y0,Fs,bits]=wavread('sound.wav');
// サンプリング周波数とビット数の読み込み
clf(3);
scf(3);
m=32768;
t=((1:m)/Fs)';
impls=zeros(1:m)
impls(1,2)=0.5
zimpls=fft(impls)
subplot(2,1,1);
plot2d1(t,impls)
subplot(2,1,2);
plot2d("ll",(1:m/16)*Fs/m,(abs(zimpls(1:m/16))));
implsw=impls
implswav=implsw
implswav(2,:)=implsw
savewave('impulse1.wav',implswav,Fs,16)
一応波形と FFT の結果を表示するようにしてありますが、今は結果の出力は省略します。
ここで出来た波形を impulse1.wav としてセーブしてあります。なお、スピーカが飛ぶとか、耳を痛める恐れがあるのでオーディオ再生はしないで下さい。
これを前回出てきた、「SoundEngine Free」を使って同様にリバーブを掛けます。
掛けたファイルを、impulse2.wav として保存します。
次のスクリプトは前回の波形と FFT 結果を表示するものから、ファイル名だけを変更したものです。
これを実行してみます。
y1=y1(1,:)
//片方のチャネルのみ使う
disp(Fs)
disp(bits)
// Fs=サンプリング周波数、bits=量子化ビット数を表示
m=32768;
// 入力したデータサイズの内輪でもっとも大きい2のべき乗の値をいれる。
yy0=y0(1,1:m);
yy1=y1(1,1:m);
clf(0);
scf(0);
subplot(2,1,1);
plot2d((1:m)/Fs, yy0,style=1);
zz=fft(yy0);
// yyをfftします。
subplot(2,1,2);
plot2d("ll",(1:m/16)*Fs/m, abs(zz(1:m/16)),style=1);
clf(1);
scf(1);
subplot(2,1,1);
plot2d((1:m)/Fs, yy1,style=1);
zz=fft(yy1);
// yyをfftします。
subplot(2,1,2);
plot2d("ll",(1:m/16)*Fs/m, abs(zz(1:m/16)),style=1);
こちらが元のインパルスです。

波形の方は何も見えませんが、ゼロ付近を拡大すると見えます。(省略)
FFT 結果は教科書の通り、全帯域でフラットなエネルギーを持っています。
こちらがリバーブ後です。

エフェクトゲインを高く取っているため、波形が見えてみます。FFT 上もレベルが上がっています。
そしてどこからやってきたのか、1Hz ~ 10Hz の低域が持ち上がっています。
それと 30Hz ぐらいからレベルのピークとディップが現れます。
低域も関係あるかも知れませんが、普通のスピーカでは再生できない周波数なので、どちらかというと高い周波数でのピークとディップが残響感を出しているのではないでしょうか。
リバーブの物理的意味というのは別途考察してみようと思います。