i室長:前回のグラフはsemilogxを使ってX軸が対数表示だったので、通常のplotの表示にしてみる。octaveを起動して以下のとおり入力するぞ。
fs=96000;
tap=512;
cf=[300 2500];
w=cf/(fs/2);
a=fir1(tap-1,w,'pass',kaiser(tap,8));
[h w]=freqz(a,1,4096,fs);
clf;
plot(w,a2db(abs(h)));
axis ([0 2800 -10 0]);
どうじゃ、左右対称だろう。だが人間の感覚にあわせて対数表示にすると低域側の減衰量が足りないことになるのだ。周波数の分解能も一定なのだが対数で考えると低域側で不足することになる。
助手:なるほど。同じ20Hzの差でも10000Hzと10020Hzでは0.2%としか違わないけど20Hzと40Hzでは1オクターブ違いますからね。
室長:ではtap数を変えて表示してみよう。
fs=96000;
cf=[300 2500];
w=cf/(fs/2);
clf;
hold on;
c=1;
for tap=[512 1024 2048 4096 8192]
a=fir1(tap-1,w,'pass',kaiser(tap,8));
fmt=num2str(c++);
filterplot(a,96000,16384,fmt);
endfor
どうじゃ?
助手:サンプリング96kで300Hz程度のクロスならばtap数1024でアナログフィルタ並、4096あればデジタルフィルタらしい切れ味になりますね。
室長:うむ、サブウーファー用にもっと低いクロスで急峻な特性にするにはさらに長いtap数が必要になるのだ。 そうだ、フィルタの周波数特性ばかり見てフィルタ自身の波形をみるのをわすれとった。
fs=96000;
tap=4096;
cf=[300 2500];
w=cf/(fs/2);
a=fir1(tap-1,w,'pass',kaiser(tap,8));
clf;
plot(a);
さて次回から実際に3way用のフィルタを実際に作ってデジタルチャンデバを作っていくぞ。