- 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がフラットになります。
アナログでの特性
- 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のような特性しか出ないのが判ります
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フィルタ。後ろの赤線がアナログフィルタの特性
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フィルターでカバーしましょう。
プライバシーポリシー本文は日本語以外に翻訳禁止