BiQuad Filter(双2次フィルタ)の設計

2024年5月11日信号処理,工学,数学

デジタルフィルタでよく使われているBiQuadフィルタ(双2次フィルタ)の設計手法とか色々のまとめ。

BiQuadフィルタとは

そもそもBiQuadフィルタとはなんぞ?ってことですが
率直に言うと下図のフィルタをそう言います。*1

f:id:tsubakurame-1913:20211021161956j:plain
Bi-Quad Filter

フィルタということで、入力x(n)に対してy(n)が出力されます。
その際に、遅延器(図中で\(Z^{-1}\)と表記)によって信号が最大2回遅延されます。
で、\(a_0,a_1\)といった係数によって入力信号が変化し、加算されて出力されます。
これを差分方程式で表現すると
$$
a_0y(n)=b_0x(n)+b_1x(n-1)+b_2x(n-2)-a_1y(n-1)-a_2y(n-2)
$$
と書き表せます。
これを伝達関数に変換すると
\displaystyle H(z)=\frac{b_0+b_1z^{-1}+b_2z^{-2}}{a_0+a_1z^{-1}+a_2z^{-2}}
これをa_0=1になるようにすべての項をa_0で割ります(ノーマライズ
\displaystyle H(z)=\frac{\frac{b_0}{a_0}+\frac{b_1}{a_0}z^{-1}+\frac{b_2}{a_0}z^{-2}}{1+\frac{a_1}{a_0}z^{-1}+\frac{a_2}{a_0}z^{-2}}
これを更に差分方程式で書き直すと
\displaystyle y(n)=\frac{b_0}{a_0}x(n)+\frac{b_1}{a_0}x(n-1)+\frac{b_2}{a_0}x(n-2)-\frac{a_1}{a_0}y(n-1)-\frac{a_2}{a_0}y(n-2)

これがBiQuadフィルタの基本形です。

係数の導出

BiQuadフィルタの入力と出力の関係はわかったとして、a_0だとかb_0だとかの係数ってどうなっとるんじゃい?
ということで、BiQuadの係数を導きます。
BiQuadフィルタは2次の伝達関数が既知であれば、そのフィルタをこれ一つで作れることです。
つまりハイパスもローパスもこれ一本。

係数導出の前の準備

まずは、あらかじめ自分で設定しておくべきパラメータがあります。

  • F_s:サンプリング周波数
  • f :フィルタの中心周波数(カットオフ周波数)
  • Q :Quality Factor、共振周波数における信号の鋭さを表します。よく使われるのは\frac{1}{\sqrt{2}}

その他、よく使うもの

  • ω\displaystyle 2πf
  • ω_0\displaystyle \frac{2πf}{F_s}
  • T :\displaystyle \frac{1}{F_s}
  • α :\displaystyle \frac{sin(\omega_0)}{2Q}

まず係数を求めるには双一次変換をします。
双一次変換については長くなりすぎるので省略
双一次変換 – Wikipedia

簡単に言うと、双一次変換を使うとs平面関数とz平面関数を変換することができます。
そんでもって、双一次変換したsはz平面上では
\displaystyle s=\frac{2}{T}\frac{1-z^{-1}}{1+z^{-1}}
となります。

さらに。
離散時間周波数と連続時間周波数では誤差が生じます。
例えば離散時間周波数で1[kHz]の中心周波数を得たい場合、連続時間周波数では中心周波数が異なります。
この歪を解消するためにプリワーピングが必要となります。
連続時間での角速度ω_aを離散時間の角速度ωで表すと
\displaystyle ω_a=\frac{2}{T}\tan(ω\frac{T}{2})
となります。この誤差を修正するためにこれで割ります。
\displaystyle s=\frac{\frac{2}{T}\frac{1-z^{-1}}{1+z^{-1}}}{\frac{2}{T}\tan(ω\frac{T}{2})}
わかりやすい形になおすと
\displaystyle s=\frac{1}{\tan(ω\frac{T}{2})}\frac{1-z^{-1}}{1+z^{-1}}
\displaystyle s=\frac{1}{\tan(\frac{ω_0}{2})}\frac{1-z^{-1}}{1+z^{-1}}

となり、周波数ワーピング済みの双一次変換式ができました。

この求めたsを使って
\displaystyle s=\frac{1}{\tan(\frac{ω_0}{2})}\frac{1-z^{-1}}{1+z^{-1}}
\displaystyle s^2= \frac{1}{(\tan(\frac{ω_0}{2}))^2}(\frac{1-z^{-1}}{1+z^{-1}})^2
ここで半角の公式
\displaystyle \tan{(\frac{ω_0}{2})} = \frac{\sin{(ω_0)}}{1+\cos{(ω_0)}}
\displaystyle \tan^2{(\frac{ω_0}{2})} = \frac{1-\cos(ω_0)}{1+\cos(ω_0)}
を利用して
\displaystyle s=\frac{1+\cos(\omega _0)}{\sin(\omega _0)}\frac{1-z^{-1}}{1+z^{-1}}
\displaystyle s^2=\frac{1+\cos(\omega _0)}{1-\cos(\omega _0)}\frac{(1-z^{-1})^2}{(1+z^{-1})^2}
共通因数を作るためにs^2をベースにs,1の項を変形する。
\displaystyle 1 = \frac{1+\cos(\omega _0)}{1+\cos(\omega _0)}\frac{(1+z^{-1})^2}{(1+z^{-1})^2}
\displaystyle s = \frac{1+\cos(\omega _0)}{\sin(\omega _0)}\frac{(1-z^{-1})(1+z^{-1})}{(1+z^{-1})^2}
\displaystyle s^2=\frac{1+\cos(\omega _0)}{1-\cos(\omega _0)}\frac{(1-z^{-1})^2}{(1+z^{-1})^2}
こうすると共通因数で分解できる。因数は
\displaystyle \frac{1+\cos(\omega _0)}{(1+z^{-1})^2}
分解すると
\displaystyle 1 = \frac{(1+z^{-1})^2}{1+\cos(\omega _0)}
\displaystyle s = \frac{(1-z^{-1})(1+z^{-1})}{\sin(\omega _0)}
\displaystyle s^2=\frac{(1-z^{-1})^2}{1-\cos(\omega _0)}
さらにすべての項にsin^2(\omega_0)をかけて
\displaystyle 1 = (1+2z^{-1}+z^{-2})(1-cos(\omega_0))
\displaystyle s = (1-z^{-2})sin(\omega_0)
\displaystyle s^2 = (1-2z^{-1}+z^{-2})(1+cos(\omega_0))
これらを用いて各フィルタの係数を導出します。

フィルタ係数の導出

2次ローパスフィルタの伝達関数はアナログ回路のラプラス変換から
\displaystyle \frac{1}{1+\frac{1}{Q}s+s^2}
と、既知の関数です。
先ほど求めた双一次変換式を用いると
\displaystyle \frac{(1+2z^{-1}+z^{-2})(1-cos(\omega_0))}{(1-2z^{-1}+z^{-2})(1+cos(\omega_0))+ \frac{1}{Q}(1-z^{-2})sin(\omega_0)+ (1+2z^{-1}+z^{-2})(1-cos(\omega_0))}
展開します。
\displaystyle \frac{1+2z^{-1}+z^{-2}-cos(\omega_0)-2cos(\omega_0)z^{-1}-cos(\omega_0)z^{-2}}{1-2z^{-1}+z^{-2}+cos(\omega_0)-2cos(\omega_0)z^{-1}+cos(\omega_0)z^{-2}+\frac{sin(\omega_0)}{Q}-\frac{sin(\omega_0)}{Q}z^{-2}+1+2z^{-1}+z^{-2}-cos(\omega_0)-2cos(\omega_0)z^{-1}-cos(\omega_0)z^{-2}}
\displaystyle \frac{(1-cos(\omega_0)+(2-2cos(\omega_0))z^{-1}+(1-cos(\omega_0)z^{-2}}{(2+\frac{sin(\omega_0)}{Q})-4cos(\omega_0)z^{-1}+(2-\frac{sin(\omega_0)}{Q})z^{-2}}
分母分子ともに2で割ります
\displaystyle \frac{\frac{1-cos(\omega_0)}{2}+(1-cos(\omega_0))z^{-1}+(\frac{1-cos(\omega_0)}{2})z^{-2}}{(1+\alpha)-2cos(\omega_0)z^{-1}+(1-\alpha)z^{-2}}
となり、各係数が導出されました。
\displaystyle a_0=1+\alpha
\displaystyle a_1=-2cos(\omega_0)
\displaystyle a_2=1-\alpha
\displaystyle b_0=\frac{1-cos(\omega_0)}{2}
\displaystyle b_1=1-cos(\omega_0)
\displaystyle b_2=\frac{1-cos(\omega_0)}{2}

そのほかフィルタ係数も、同様の手順で求めることができます。

参考サイト
BiQuadフィルタの料理法 | g200kg Music & Softwares

*1:2021/10/21追記:図に誤りがあったため修正