A12 Octaveでフィルタ設計fir2

室長:前回の音がなぜいまいちなのかわかるか?

助手:調整してないからって自分で言ってたじゃないですか。

室長:そうだったな。だがあのシステムでは調整範囲が狭いのだ。brutefirにもイコライザ機能があるがとりあえずそれを使わないことにすると、カットオフ周波数の変更とAVアンプのch間のレベル調整しかない。それだとユニットやエンクロージャ、部屋の低域特性などがある程度フラットでないと調整し切れずにマルチアンプは失敗に終わる。

助手:それじゃあアナログのチャンネルデバイダはほとんどうまくいかないんじゃないですか。

室長:その通り。そこを先人たちは血のにじむような努力をしてセッティングで調節し、ユニットを交換し、エンクロージャを作り替え、部屋の改造をし、場合によってはイコライザを併用した。そして素晴らしい音を出せたシステムは一部で、多くはまともな音が出ずに失敗に終わったのじゃ。いまでもネット上でマルチアンプにするよりもシングルアンプのほうが良いという意見をいくつか見ることが出来る。

助手:たしかにマルチアンプだどうしても必要機材が増えるので同じコストだとシングルアンプに比べて不利な気もします。

室長:でもな、ワシの経験だと予算が5万~100万程度の範囲ではマルチアンプで自作スピーカーの方がシングルアンプよりもメリットがある。

助手:室長の経験は大抵の場合あてにならないですがね。

室長:いちいち余計な事をいわんでよろしい。ともかくワシは先人のような血のにじむ努力はしたくないので、ユニットやエンクロージャ、部屋の特性はデジタルフィルタで補正することにする。そこでoctaveのfir2関数じゃ。

助手:もう後は言われなくてもわかります。octaveのコマンドラインで’help fir2’として説明を読んで実際にフィルタを作って特性を見てみれば良いんですね。

fs=96000;
tap=4096;
f=[0  80 110 300 310 fs/2];
m=[10 10  0   0 -300 -300];
f=f/(fs/2);
m=db2a(m);
a=fir2(tap-1,f,m,8192,kaiser(tap,8));
clf;
filterplot(a,fs);

fig1 低域を+10dB持ち上げたローパスフィルタを作って見ました。

室長:低域のgainが0dBを越えてるな。これだとその周波数で入力が大きいと出力がクリッピングしてしまう。brutefirは内部演算は64bitで行っているので大丈夫だがサウンドデバイスに出力するときに0dB以上は出力できない。そこでbrutefirの設定ファイルで減衰させるか、フィルタの自体を変更して0dBを越えないようにする。まあ20Hzでフルスケールの入力があることは稀だからその辺は意図的にレベルオーバーを許容する考えもあるぞ。今回はピークが0dBになるようにフィルタを計算する。

助手:計算する前にmを-10dBするか、計算後のフィルタの係数を-10dBすれば良さそうですね。係数の方をを-10dBしてみます。さっきの計算に続けて

a=a*db2a(-10);
filterplot(a,fs);

fig2

fとmを指定するだけで自由な特性のフィルタが作れますね。あとはどういうフィルタを作れば良いか測定していけば良いのですね。

室長:その通りだ。だが測定の前に次回はfirフィルタについて知っておきたいことをちょっとだけ考えてみよう。

2012年12月16日