## 前言
濾波器的設計與實作在數位訊號處理領域是無可避免的,MATLAB或是Python等程式語言提供了很好的分析模擬工具,但是在應用層面幾乎不可能用這樣的方式,往往需要實時的做訊號處理。
像是前一篇[IMP筆記](https://hackmd.io/@zhewei0113/SkUEGv3Oxl)中有提到要在迴授迴路中並聯一個peak filter,這時候就需要用電腦(可能是MCU或是RT Target)來完成。
## 濾波器基本原理--以峰值濾波器 Peak filter為例
在實作方面,會用差分的方式來實現數位的濾波器,對於一個二階的數位濾波器,其transfer function的通式如下
$$
H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}
{a_0 + a_1 z^{-1} + a_2 z^{-2}}
$$
但是如果用通式來表示濾波器的話其實對於使用者來說不好調整參數,因為$a_i、 b_i$等等係數沒有什麼物理意義,所以以下有另外有兩種參數化的方式:
### Robert Bristow-Johnson (RBJ)參數化
Robert Bristow-Johnson把常見的濾波器都參數化,詳細的公式可以參考[Audio EQ cookbook](https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html)
將濾波器中$a$,$b$等係數改用$\omega_0, G_{dB}, Q$來表示
$$
\omega_0 = 2\pi \frac{f_0}{f_s},\qquad
A = 10^{G_{dB}/40},\qquad
\alpha = \frac{\sin\omega_0}{2Q}
$$
其中$\omega_0$是濾波器的中心頻率或是截止頻率;$G_{dB}$可以調整增益,對於peak filter來說 $G_{dB}>0$而notch filter則是 $G_{dB}<0$;$Q$為quality factor,$Q$越大對於頻率的選擇效果越好。
peak filter對應的係數公式如下:
$$
\begin{aligned}
b_0 &= 1 + \alpha A,\\
b_1 &= -2\cos\omega_0,\\
b_2 &= 1 - \alpha A,\\[4pt]
a_0 &= 1 + \frac{\alpha}{A},\\
a_1 &= -2\cos\omega_0,\\
a_2 &= 1 - \frac{\alpha}{A}.
\end{aligned}
$$
實務上常把用$a_0$把所有係數正歸化,最終結果則寫為:
$$
H(z)
= \frac{\tilde b_0 + \tilde b_1 z^{-1} + \tilde b_2 z^{-2}}
{1 + \tilde a_1 z^{-1} + \tilde a_2 z^{-2}},
\quad
\tilde b_i = \frac{b_i}{a_0},\;
\tilde a_i = \frac{a_i}{a_0}\ (i=1,2).
$$
### 零點極點放置(Pole-Zero placement)
peak filter的轉移函數同樣可以表示為:
$$
H(z) = K \cdot
\frac{1 - 2 r_z \cos(\omega_0)\, z^{-1} + r_z^2 z^{-2}}
{1 - 2 r_p \cos(\omega_0)\, z^{-1} + r_p^2 z^{-2}}
$$
其中的參數意義為
- $\omega_0 = 2\pi{f_0}{T_s}$ : 為數位角頻率
- $f_0$:中心頻率 (Hz)
- $T_s$:取樣時間
- $r_z$:零點半徑
- $r_p$:極點半徑
- $K$:增益常數(用來調整通帶增益)
> $r_p > r_z$代表極點更接近單位圓邊界,為peak filter
> $r_p < r_z$則是notch filter
> 這個表示法的好處是做控制理論的分析會比較方便,可以根據pole zero的位置去做濾波器設計
## LabVIEW 程式實作與說明
主要會用到`.vi`有
- formula node
> 類似C語言的寫法,但是須注意宣告浮點數的時候
- IIR Filter PtByPt
## 範例程式
LabVIW實作程式請見: https://github.com/zheweilai/LabVIEW-Filter-Implementation.git