來源:https://zhuanlan.zhihu.com/p/51097798
在文章如何快速設計一個FIR濾波器(一)以及如何快速設計一個FIR濾波器(二)等文章中,我們討論了如何設計FIR(Finite Impulse Response Filter),FIR有很多優點,比如可以獲得線性相位,不存在穩定性問題等,典型的FIR具有如下形式:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD15JTVCbiU1RCUzRCU1Q3N1bV8lN0JwJTNEMCU3RCU1RSU3Qk0lN0RhX3B4JTVCbi1wJTVE.png)
當
時幅值響應可以變得更為陡峭和理想,這樣做的缺點就是需要采集更多的點進行計算,有時候這么做不太適用。因此工程上很多時候采用的是IIR(Infinite Impulse Response Filter),IIR和FIR最大的區別就是輸出不僅僅取決於輸入,還取決於輸出,IIR的標准形式如下:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD15JTVCbiU1RCUzRCU1Q3N1bV8lN0JwJTNEMCU3RCU1RSU3Qk0lN0RhX3B4JTVCbi1wJTVEJTJCJTVDc3VtXyU3QnElM0QwJTdEJTVFJTdCTiU3RGFfcXklNUJuLXElNUQ=.png)
IIR的設計和FIR有較大的區別,接下來我們就簡單討論一下,先從一個最常見的傳遞函數說起。
一、從一個最常見的傳遞函數說起
慣性環節是我們碰到最多的傳遞函數了,其基本形式如下:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI4cyUyOSUzRCU1Q2ZyYWMlN0IlNUNvbWVnYV9jJTdEJTdCcyUyQiU1Q29tZWdhX2MlN0QlM0QlNUNmcmFjJTdCMSU3RCU3QiU1Q2ZyYWMlN0IxJTdEJTdCJTVDb21lZ2FfYyU3RHMlMkIxJTdE.png)
這個函數有什么特點呢?——無外乎就是從幅值響應和相位響應兩個角度來看了。我們只考慮穩態時系統的響應,也就是令
,於是傳遞函數形式可以改寫為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI4JTVDb21lZ2ElMjklM0QlNUNmcmFjJTdCMSU3RCU3QmolNUNmcmFjJTdCJTVDb21lZ2ElN0QlN0IlNUNvbWVnYV9jJTdEJTJCMSU3RA==.png)
我們來簡單的分析一下這個傳遞函數,很顯然:
當
時,
;
當
時,
;
當
時,
;
也就是說,
在低頻是幅值響應大(沒衰減,為1),頻率增加到
時幅值響應下降到
,當頻率增加到
時,幅值響應降到了幾乎為零,因此這個濾波器應該是一個低通濾波器。下面我們從數學的角度嚴謹的看一下,
幅值響應為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNsZWZ0JTdDK0glMjglNUNvbWVnYSUyOSU1Q3JpZ2h0JTdDJTNEJTVDZnJhYyU3QjElN0QlN0IlNUNzcXJ0JTdCJTI4JTVDb21lZ2ElMkYlNUNvbWVnYV9jJTI5JTVFMiUyQjElN0QlN0QlM0QlNUNmcmFjJTdCJTVDb21lZ2FfYyU3RCU3QiU1Q3NxcnQlN0IlNUNvbWVnYSU1RTIlMkIlNUNvbWVnYV9jJTVFMiU3RCU3RA==.png)
相位響應為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNhbmdsZStIJTI4JTVDb21lZ2ElMjklM0QtYXRhbiU1Q2xlZnQlMjgrJTVDZnJhYyU3QiU1Q29tZWdhJTdEJTdCJTVDb21lZ2FfYyU3RCslNUNyaWdodCUyOQ==.png)
畫個圖更直觀:

可見,這確是一個低通濾波器。我們知道截止頻率的定義是當輸出幅值響應下降到輸入幅值的-3dB (
),也就是0.707(也就是
)時對應的頻率。因此,此處
就是截止頻率。
二、如何設計一個高通模擬濾波器
對於低通濾波器,令截止頻率
,形式為:
,我們把這個稱之為標准化的低通濾波器。那假如我們現在想設計一個高通濾波器
該怎么辦呢?

同樣令
,我們的目標是:
當
時,
;
當
時,
;
當
時,
;
很簡單,將
即可,則傳遞函數變形為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI3JTI4cyUyOSUzRCU1Q2ZyYWMlN0JzJTdEJTdCcyUyQiU1Q29tZWdhX2MlN0Q=.png)
我們畫個圖看一下:

哈哈,果然是高通濾波器,而且截止頻率就是
。
三、如何設計一個帶通模擬濾波器
那假如我們現在想設計一個帶通濾波器該怎么辦呢?

也就是我們想要:
當
時,
;
當
時,
;
當
時,
;
當
時,
;
、
分別為帶通的高和低端的頻率。我們經過幾次嘗試以后呢發現,可以將標准形式的低通濾波器中
進行如下替換就可以實現:
,其中
,
。
則變換后的傳遞函數變為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI4cyUyOSUzRCU1Q2ZyYWMlN0IxJTdEJTdCJTVDZnJhYyU3QnMlNUUyJTJCJTVDb21lZ2FfMCU1RTIlN0QlN0JCcyU3RCUyQjElN0QlM0QlNUNmcmFjJTdCQnMlN0QlN0JzJTVFMiUyQkJzJTJCJTVDb21lZ2FfMCU1RTIlN0Q=.png)

於是就得到了一個帶通濾波器。
四、如何設計一個帶阻模擬濾波器
那假如我們現在想設計一個帶阻濾波器該怎么辦呢?

同樣令
,也就是我們想要:
當
時,
;
當
時,
;
當
時,
;
當
時,
;
同樣,我們將標准形式的
進行變換,
,則可以得到:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI4cyUyOSUzRCU1Q2ZyYWMlN0IxJTdEJTdCJTVDZnJhYyU3QkJzJTdEJTdCcyU1RTIlMkIlNUNvbWVnYV8wJTVFMiU3RCUyQjElN0QlM0QlNUNmcmFjJTdCcyU1RTIlMkIlNUNvbWVnYV8wJTVFMiU3RCU3QnMlNUUyJTJCQnMlMkIlNUNvbWVnYV8wJTVFMiU3RA==.png)
畫個圖看看:

可見,確實得到了一個帶阻濾波器。
好了,需要停下來總結一下,我們有了一個標准的低通模擬濾波器
,通過適當的變形,我們可以得到相應的高通、帶通及帶阻模擬濾波器。但是我們現在是要設計數字濾波器啊,這不是跑題了嗎?——也不見得,按照我們的直覺,模擬濾波器和數字濾波器應該存在某種聯系,如果我們找到了這個聯系,就可以通過模擬濾波器來得到數字濾波器,問題就解決了。那這個聯系是什么呢?——雙線性變換。
五、什么是雙線性變換
在如何理解離散傅里葉變換及Z變換一文中我們介紹了什么是z變換,以及z和s的關系:
,其中
為采樣周期。這就是模擬(s)和數字(z)的聯系,理論上可以直接用的,指數函數用起來比較復雜,不方便,我們需要一個更簡單的形式。
稍微變一下形:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16JTNEZSU1RSU3QnNUJTdEJTNEJTVDZnJhYyU3QmUlNUUlN0JzVCUyRjIlN0QlN0QlN0JlJTVFJTdCLXNUJTJGMiU3RCU3RA==.png)
我們知道,函數
的泰勒展開為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1lJTVFJTdCeCU3RCUzRDElMkIlNUNmcmFjJTdCeCU3RCU3QjElMjElN0QlMkIlNUNmcmFjJTdCeCU1RTIlN0QlN0IyJTIxJTdEJTJCJTVDZnJhYyU3QnglNUUzJTdEJTdCMyUyMSU3RCUyQi4uLi4=.png)
利用上式分別對分子和分母進行泰勒展開,並只取前兩項:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16JTNEJTVDZnJhYyU3QmUlNUUlN0JzVCUyRjIlN0QlN0QlN0JlJTVFJTdCLXNUJTJGMiU3RCU3RCU1Q3NpbWVxKyslNUNmcmFjJTdCMSUyQnNUJTJGMiU3RCU3QjEtc1QlMkYyJTdE.png)
稍微變一下形:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1zJTVDc2ltZXErKyU1Q2ZyYWMlN0IyJTdEJTdCVCU3RCU1Q2xlZnQlMjgrJTVDZnJhYyU3QnotMSU3RCU3QnolMkIxJTdEKyU1Q3JpZ2h0JTI5JTNEMmZfcyU1Q2xlZnQlMjgrJTVDZnJhYyU3QnotMSU3RCU3QnolMkIxJTdEKyU1Q3JpZ2h0JTI5.png)
這就是雙線性變換了,為啥這個名字呢?——因為它是用兩個s域的線性函數的比值來逼近z的。我們稍微做一個推演,看看雙線性變換代表什么。首先看一下z域的單位圓:

我們知道:
- 在s域,s=0時對應的是零頻率,對應到z域就是z=1;
- 在s域,s=∞時對應的是無窮大頻率f=∞。通過非線性變換,我們知道此時z=-1,對應的頻率就是
;
因此,雙線性變換本質就是就是將s域(模擬量)無窮大的頻率映射到z域的
,因為根據香濃采樣定理,數字信號的包含的最大分量的頻率就是一半的采樣頻率,否則就會產生混疊。

可見,對於雙線性變換而言,在s域的頻率和z域對應的頻率不同,發生了一定的彎曲,也就意味着截止頻率在s域和在z域是不一樣的,現在我們需要找到這種關系。
在z域,假設截止頻率為
,則
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD16JTNEZSU1RSU3QmoyJTVDcGkrJTVDZnJhYyU3QmZfZCU3RCU3QmZfcyU3RCU3RA==.png)
根據雙線性變換計算得到的s為
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1zJTNEMmZfcyU1Q2ZyYWMlN0JlJTVFJTdCajIlNUNwaSslNUNmcmFjJTdCZl9kJTdEJTdCZl9zJTdEJTdELTElN0QlN0JlJTVFJTdCajIlNUNwaSslNUNmcmFjJTdCZl9kJTdEJTdCZl9zJTdEJTdEJTJCMSU3RCUzRGoyZl9zdGFuJTI4JTVDZnJhYyU3QiU1Q3BpK2ZfZCU3RCU3QmZfcyU3RCUyOQ==.png)
此時s對應模擬的頻率為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1zJTNEajIlNUNwaStmX2E=.png)
所以
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1qMiU1Q3BpK2ZfYSUzRGoyZl9zdGFuJTI4JTVDZnJhYyU3QiU1Q3BpK2ZfZCU3RCU3QmZfcyU3RCUyOQ==.png)
即
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1mX2ElM0QlNUNmcmFjJTdCZl9zJTdEJTdCJTVDcGklN0R0YW4lMjglNUNmcmFjJTdCJTVDcGkrZl9kJTdEJTdCZl9zJTdEJTI5.png)
也就是說對於雙線性變而言,模擬的截止頻率和數字的截止頻率是不同的,不同的原因是因為雙線性變換是近似變換,不是准確換算。
值得一提的是,當
時,即采樣頻率遠大於截止頻率,可以得到
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1mX2ElM0QlNUNmcmFjJTdCZl9zJTdEJTdCJTVDcGklN0R0YW4lMjglNUNmcmFjJTdCJTVDcGkrZl9kJTdEJTdCZl9zJTdEJTI5JTVDc2ltZXElNUNmcmFjJTdCZl9zJTdEJTdCJTVDcGklN0QlMjglNUNmcmFjJTdCJTVDcGkrZl9kJTdEJTdCZl9zJTdEJTI5JTNEZl9k.png)
也就是模擬的截止頻率和數字的截止頻率差不多,為簡單起見,也可以直接用數字的截止頻率代替模擬的截止頻率。
六、如何設計數字濾波器
有了前面的鋪墊,我們就可以進行數字的IIR濾波器設計了,基本有如下五個步驟:
- 選擇一個歸一化的模擬濾波器
; - 確定數字濾波器的截止頻率,也就是響應為-3dB(幅值衰減為
)是對應的頻率; - 利用公式
計算對應的模擬截止頻率; - 選擇合適的變換,得到
比如對於低通濾波器:
其中
。 - 在
中,用
進行替換,得到數字化的濾波器
。
舉個例子,現在假設要設計一個低通濾波器,截止頻率為
,采樣頻率為
。
step1:選擇歸一化的濾波器
;
step2:數字截止頻率為10Hz;
step3:對應的模擬截止頻率為:
;
step4:將
中s進行替換:
,
。得到:
,其中
;
step5: 用
進行替換,得到 ![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI4eiUyOSUzRCU1Q2ZyYWMlN0IwLjQyMDYlMjh6JTJCMSUyOSU3RCU3QnotMC4xNTg3JTdE.png)
於是就得到了我們想要的濾波器。
七、如何利用MATLAB進行IIR設計
前面手動設計IIR濾波器是為了告訴大家基本的設計原理,實際工程中我們一般采用計算機來進行設計,快速、准確、可視化程度高,下面我們就來看看如何利用MATLAB來設計IIR濾波器。
最常用的函數就是butter函數,具體語法為:
[a b]= butter(N,Wn,'low');
a和b就是就是IIR濾波器分子和分母對應的系數:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI4eiUyOSUzRCU1Q2ZyYWMlN0JhXzAlMkIlNUNzdW1fJTdCcCUzRDElN0QlNUUlN0JtJTdEYV9weiU1RSU3Qi1wJTdEJTdEJTdCMS0lNUNzdW1fJTdCcSUzRDElN0QlNUUlN0JuJTdEYl9xeiU1RSU3Qi1xJTdEJTdE.png)
為截止頻率,low代表低通濾波器。
我們來驗證一下我們前面設計的IIR濾波器對不對。根據定義
,MATLAB中輸入[a b]= butter(1,0.4,'low'),其計算結果為:
a =[0.4208 0.4208],b =[1.0000 -0.1584]
可見,是一致的(因為手算位數少,會有一定的計算誤差)。
可能有的童鞋就納悶了,在設計FIR時,用的函數是fir1、fir2等,一看就是FIR濾波器,為啥到IIR函數的名字就叫butter了,難道第一個設計IIR的人喜歡吃黃油?——哈哈,當然不是,其實butter是butterworth(巴特沃斯)的簡寫,那butterworth又是什么呢?——看拼寫像是一個人名,沒錯,這就是一個人名。那為啥用這個名字呢?
還記得我們一開始選取的標准低通濾波器的函數嗎?
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI4cyUyOSUzRCU1Q2ZyYWMlN0IlNUNvbWVnYV9jJTdEJTdCcyUyQiU1Q29tZWdhX2MlN0QlM0QlNUNmcmFjJTdCMSU3RCU3QjElMkIlNUNmcmFjJTdCMSU3RCU3QiU1Q29tZWdhX2MlN0RzJTdE.png)
穩態時可用
,則
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1IJTI4JTVDb21lZ2ElMjklM0QlNUNmcmFjJTdCMSU3RCU3QjElMkJqJTVDZnJhYyU3QiU1Q29tZWdhJTdEJTdCJTVDb21lZ2FfYyU3RCU3RA==.png)
即
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNsZWZ0JTdDK0glMjglNUNvbWVnYSUyOSslNUNyaWdodCU3QyU1RTIlM0QlNUNmcmFjJTdCMSU3RCU3QjElMkIlNUNsZWZ0JTI4KyU1Q2ZyYWMlN0IlNUNvbWVnYSU3RCU3QiU1Q29tZWdhX2MlN0QrJTVDcmlnaHQlMjklNUUyJTdE.png)
這其實是一類函數的特殊形式:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNsZWZ0JTdDK0hfYSUyOCU1Q29tZWdhJTI5KyU1Q3JpZ2h0JTdDJTVFMiUzRCU1Q2ZyYWMlN0IxJTdEJTdCMSUyQiU1Q2xlZnQlMjgrJTVDZnJhYyU3QiU1Q29tZWdhJTdEJTdCJTVDb21lZ2FfYyU3RCslNUNyaWdodCUyOSU1RSU3QjJOJTdEJTdE.png)
其中
為濾波器的階次,
為截止頻率,當N=1時時就是我們選擇的那個標准的一節慣性環節,感興趣的童鞋可以試一下這類函數的性質。這類函數最早是由一個叫butterworth的人提出的,因此,基於這類函數而衍生的濾波器就是butterworth濾波器,MATLAB就用butter函數來致敬butterworth。
當然基准函數的獲取,除了butterworth的方法,還有其他的方法,他們的特點分別為:
- Butterworth(巴特沃斯)濾波器:濾波器具有單調下降的幅頻特性;
- Chebyshev(切比雪夫)濾波器:幅頻特性在銅帶或阻帶內有波動,可提高選擇性;大約有3/4通帶接近線性相位;
- Bessel(貝塞爾)濾波器:通帶內有較好的線性相位;
- Ellipse(橢圓)濾波器:較好的線性相位;大約有1/2通帶接近線性相位。
它們的幅值響應如下圖所示。

除了butter函數外,當然我們不需要記住其他的命令,當需要其他類型的IIR時,打開MATLAB,在命令行輸入:filterDesigner或者fdatool(老版MATLAB),你就能看到如下界面:

通過勾勾選選就能設計IIR濾波器哦!
