裏目小僧の部屋

フィルタIIR二次

2次のIIRフィルターで出来る事
  • LPF 低周波成分は普通に通し高周波成分程にカットする
  • HPF 高周波成分は普通に通し低周波成分程にカットする
  • BPF 指定周波数成分付近だけを通す
  • APF 周波数成分には影響なく位相にだけ影響を与える
  • BEF 指定周波数を0=カットする(入力からBPF通過結果を減じたものと等価)

これらを組み合わせて

  • BEQ ベル型のイコライザ(指定周波数付近の増減調整)
  • LCT 低周波成分の増減調整
  • HCT 高周波成分の増減調整

が可能です

1次のIIRフィルターとの違い
LPF HPF APFの3つは一次にもあります。一次を2個組み合わせるのと同等のものも作れるし、一次の組み合わせでは作れない特性もあります。そのためf0の他にQが指定されます。

  • 1次では同じf0のLPF+HPFがフラットになりました。 2次では同じf0,QのLPF+BPF+HPFがフラットになります。

アナログでの特性

グラフ上マウス等でf0付近をドラッグすればf0 Qを変更可
HPF/LPFのカット側は1次と同じく周波数比例
ただし傾斜が2倍になっています

  • -12dB/oct (周波数が2倍 or 半分になったら強度は1/4になる)
  • -40dB/dec(周波数が10倍 or 1/10になったら強度は1/100)
HPF/LPFのカット側は最大180度に向けて回転する
符号は反対です
APFは周波数が低い程最大360度に向けて回転する
f0で丁度180度回転し、グラフの都合で上下跳躍します
BPFの左右ゲイン低下は1次と同じ-6dB/oct
位相はf0で0度で左右は1次のHPF/LPFと同じ方向に90度まで回転します
BEFは
1-BPFで求まるので位相もそのような形になります

 デジタルフィルターの周波数特性

最初に分母だけのIIRフィルタの特性を見てみます。

  • Z=1/z fsサンプリング周波数 
  • Z変換でDC[1]の時Z=1 fs/2の時 Z=-1を代入
     a         DC では a/(1-b1-b2) 
-----------    fs/2ではa/(1+b1-b2)
(1-b1Z-b2Z2)
どんな特性になるかb1,b2を変更してみましょう
係数の少しの変化で大きく特性が変わる事と、LPFのような特性しか出ないのが判ります

そこで、f0,Qからb1,b2を求めてみます。 w=2PI*f0/fsとして

     b1 = 2-w/Q-w*w
     b2 = -1+w/Q
     a0 = (1-b1-b2)

としたのが Q とf0のツマミです。 精密にするなら(精密にする意味はあまりないけどQを∞にした時の周波数とか知りたいなら)

     b1 = 2*cos(w)/exp(w/(2*Q))
     b2 = -exp(-w/Q )
  • このフィルタを直接使う事はあまりないでしょう(係数を動的に調整したいなら別ですが)

ただ実際の2次フィルタの分母はすべてこの形なのです。

実際に使うデジタル2次フィルタは
双一次変換でアナログフィルタから求めたものです

 α=1/Q   w=tan(PI*f0/fs) w2=w*w Z=1/zとして
    HPF           BPF          LPF
   (1-2Z+Z2)     αw(1-Z2)   w2*(1+2Z+Z2)
 ------------------------------------------
     (1+αw+w2) -2(1-w2)Z + (1-αw+w2)Z2
QはHPF/LPFでは1/√2 約0.7071 にする事が多い

分母の最初の項は1でなければならないので

w=tan(PI*f0/fs 
w2=w*w;
k0=1+w/Q + w2;
k1 =2*(1-w2);
k2 =1-w/Q+w2;
b1 = k1/k0;
b2 =-k2/k0;
a0 Z変換式 Z=1/z 対応するアナログラプラス変換
HPF a0=1/k0; a0*(1-2Z+Z2)/(1-b1Z-b2*Z2) w0=2PI*f0;w2=w0*w0;s2/((w2+w0/Q*s+s2)
LPF a0=w2/k0; a0*(1+2Z+Z2)/(1-b1Z-b2*Z2) w0=2PI*f0;w2=w0*w0;w2/(w2+w0/Q*s+s2)
BPF a0=w/Q/k0; a0*(1 -Z2)/(1-b1Z-b2*Z2) w0=2PI*f0;w2=w0*w0;w0/Q*s/(w2+w0/Q*s+s2)
BEF a0=(1+w2)/k0;a1=-2*(1-w2)/k0; (a0+a1Z+a0Z2)/(1-b1Z1-b2*Z2); w0=2PI*f0;w2=w0*w0;(s2+w2)/(w2+w0/Q*s+s2)
APF (-b2-b1Z+Z2)/(1-b1Z-b2*Z2) w0=2PI*f0;w2=w0*w0;(w2-w0/Q*s+s2)/(w2+w0/Q*s+s2)

となります。分子の形を見れば判るように 5つのフィルターには

  • 1) LPF+BPF+HPF=1
  • 2) LPF-BPF+HPF=APF
  • 3) BPF+BEF=1 or LPF+HPF=BEF

の関係があります。

  • 1)に係数H0.B0,L0をかけて H0*HPF+B0*BPF+L0*LPF とすれば高域,ベル型,低域のゲイン制御フィルタが作れます

グラフで見るIIR2次フィルタ

黒線がデジタルIIRフィルタ。後ろの赤線がアナログフィルタの特性


以下のコントロールバーは下の3つのボタンを押すと有効になります


g=1でフラット確認
g=1でAPFの確認
=BEFの確認

  • 上の BPFgainのスライダーでg=1以外にした時、g=10で+20dB g=0.316で-10dBとなる事からゲインについては良いとして、広がり方が上下で違うのが問題です。もっと綺麗にしてみましょう。それには、ゲインが大きければQも大きくする調整が必要です。

試してみるとQを√gain 倍に.すると綺麗な形になります。

  • HPFgain LPFgainの制御も同様で、単独で動かした場合はそれなりに動くのですが、BPFのゲインも平方根だけ動かすと綺麗にゆきます

2次のBEQ(ベル型イコライザ)

実際に Q=Q1*sqrt(g)と修正したものです



 2次デジタルフィルタ実現方法

(a0+a1Z+a2Z2)
-------------
 (1-b1-b2Z2)

この形のz変換が既に得られた後の実現方法は 入力x メモリ x1 x2 y1 y2 として

  y = b1*y1+b2*y1 + (a0*x+a1*x1+a2*x2);
  x2=x1;
  x1=x ;
  y2=y1;
  y1=y ;
 を1サンプル毎に繰り返します
  • 問題としては係数の微小な差が特性に影響を与える事(周波数の2乗の項があるので1次より厄介)
  • 動的に係数を変更するのが大変
  • 1次と違って係数を動的に変更しようとすると簡単に発振してしまい、係数が正しくなっても発振は止まらない
  • f0が低いとyのbit数がxよりも十分にないとノイズ発生器となってしまう

そこで、連分数展開してはしご形構成とか格子形構成とかを考えるわけです。が、とりあえず

64bit浮動小数点なら実用的には十分
32bit単精度浮動小数点だとf0が低いと問題
程度の話としておきましょう。

  • 動的に変更する場合は
     b1 = 2-w/Q-w*w
     b2 = -1+w/Q
     a0 = (1-b1-b2)
これをベースにする事になります。ページをあたらめて記事を書く予定です。
wが大きくなると特性がズレて来ますが、そちらはFIRフィルターでカバーしましょう。

プライバシーポリシー本文は日本語以外に翻訳禁止