IIR デジタルフィルタ Javaで自作
少ないタップ数で実現できる IIR (Infinite impulse response 無限インパルス応答)デジタルフィルタ。LPF/HPF(ローパス/ハイパスフィルタ)でも試しに作ってみようかと思う。図書館で借りた本を頼りにプログラムまで作ることにしてみた。 これまでに作ったFIRはタップ数が多く計算量が増えてしまうのに対して、IIRは極端にタップ数が少なく1~8程度。無限のフィードバックを利用することで少ないタップを実現している。欠点は位相のズレが出てしまうことと、条件によっては不安定になりやすいことなど。AudacityのLPF/HPFはIIRのButterworthを使っているので、いろいろ試したら欠点はやはり位相だと思えた。元の波形が結構大きく変化してしまう。FIRで同じようにLPF/HPFを作ると、波形の乱れはなかった。その差は歴然。ただIIRは計算量が少ないので、ディレイやリバーブ内のLPFとして使う場合には都合がよい。 IIRは元々アナログ回路用のフィルタなので、アナログ回路設計を雛形にしてデジタルに変換するという設計が基本のようだ。IIRで作れる有名なフィルタは Butterworth、Chebyshev、楕円フィルタなどがある。実際使いそうなフィルタは平坦な特性のButterworthぐらいなので、これだけ試すことにした。基本となるブロック図は以下のようなもの。図は4次のブロック図。このan、bnに係数を入れることでフィルタになる。anはフィードバックになる。さらにカスケードするなどの改良型もある。 内容を理解しようとしたら、結構難しいかも。まずは下の式から次数ごとのバターワースのプロトタイプというものを作る。 とりあえず1次から4次までのプロトタイプは数式でこのようになった。 1次 2次 3次 4次 次に求めたい特性に応じて、どの次数のButterworthを使えばよいかを計算する。Butterworthはカットオフ周波数が-3dBになるように計算されている。単純に次数が増えれば急な傾斜を実現できる。軽く高域を削る程度なら1次でよいこともあるし、完全なカットをしたいなら4次でも不十分になる。ちなみにAudacityでは1次、2次、4次、6次、8次のButterworth HPF/LPFが用意されている。