天天看點

各種濾波器的設計實作

經典濾波器和數字濾波器

 一般濾波器可以分為經典濾波器和數字濾波器。

1、經典濾波器:假定輸入信号中的有用成分和希望去除的成分各自占有不同的頻帶。如果信号和噪聲的頻譜互相重疊,經典濾波器無能為力。比如 FIR 和 IIR 濾波器等。  

2、現代濾波器:從含有噪聲的時間序列中估計出信号的某些特征或信号本身。現代濾波器将信号和噪聲都視為随機信号。包括 Wiener Filter、Kalman Filter、線性預測器、自适應濾波器等

Z變換和差分方程

  在連續系統中采用拉普拉斯變換求解微分方程,并直接定義了傳遞函數,成為研究系統的基本工具。在采樣系統中,連續變量變成了離散量,将Laplace變換用于離散量中,就得到了Z變換。和拉氏變換一樣,Z變換可用來求解差分方程,定義Z傳遞函數成為分析研究采樣系統的基本工具。

    對于一般常用的信号序列,可以直接查表找出其Z變換。相應地,也可由信号序列的Z變換查出原信号序列,進而使求取信号序列的Z變換較為簡便易行。

各種濾波器的設計實作

Z變換有許多重要的性質和定理:

- 線性定理

  設a,a1,a2為任意常數,連續時間函數f(t),f1(t),f2(t)的Z變換分别為F(z),F1(z),F2(z),則有

  

各種濾波器的設計實作

- 滞後定理

  設連續時間函數在t<0時,f(t)=0,且f(t)的Z變換為F(z),則有

  

各種濾波器的設計實作

  應用Z變換求解差分方程的一個例子:已知系統的差分方程表達式為y(n)−0.9y(n−1)=0.05u(n) ,若邊界條件y(−1)=1,求系統的完全響應。

  

各種濾波器的設計實作
  • IIR數字濾波器的差分方程和系統函數
    各種濾波器的設計實作
    其中ci為零點而di為極點。H(z)的設計就是要确定系數、或者零極點,以使濾波器滿足給定的性能名額。
  • IIR數字濾波器結構

     數字濾波器的功能本質上是将一組輸入數字序列通過一定的運算後轉變為另一組輸出數字序列。濾波器系統函數可以表達為多種不同的形式,每一種對應着不同的算法,也就對應着不同的實作結構。例如:

     

    各種濾波器的設計實作
    上述同一系統的三種不同描述形式就對應了不同的實作結構,或者說不同的濾波器結構可以實作相同的傳遞函數。IIR濾波器常見的結構形式有直接Ⅰ型、直接Ⅱ型(典範型)、級聯型、并聯型。通過差分方程能夠畫出包含回報結構的數字網絡稱為直接型。 
    各種濾波器的設計實作
    直接Ⅰ型濾波器的網絡結構可以根據差分方程很直覺地畫出(The Direct-Form I structure implements the feed-forward terms first followed by the feedback terms):
    各種濾波器的設計實作
    可以看出直接Ⅰ型濾波器需要N+M個延時單元(N≥M)。直接Ⅱ型結構是對直接Ⅰ型的變型,将上面網絡的零點與極點的級聯次序互換,并将延時單元合并。實作N階濾波器隻需要N個延時單元(The Direct-Form II structure uses fewer delay blocks than Direct-Form I),故稱為典範型。

直接Ⅱ型看上去不那麼直覺,可以通過下圖進行了解。我們可以将整個濾波器系統看成A、B兩個子系統串聯而成,由于為線性系統是以交換順序不影響最終輸出結果,傳遞函數可寫為:

各種濾波器的設計實作

直接型優點:直接型結構簡單,用的延遲器較少(N和M中較大者的個數);缺點:系數ak,bk對濾波器性能的控制關系不直接,是以調整不友善;具體實作濾波器時ak,bk的量化誤差将使濾波器的頻率響應産生很大的改變,甚至影響系統的穩定性。直接型結構一般用于實作低階系統。

級聯型:将系統傳遞函數H(z)因式分解為多個二階子系統,系統函數就可以表示為這些二階子系統傳遞函數的乘積。實作時将每個二階子系統用直接型實作,整個系統函數用二階環節的級聯實作。

  并聯型:與級聯型類似,用部分分式展開法将系統函數表示為二階子系統傳遞函數的和。每個二階子系統仍然用直接型實作,整個系統函數用二階環節的并聯實作。

用matlab設計濾波器得到參數

在IIR濾波器設計過程中,通常利用模拟濾波器來設計數字濾波器,要先根據濾波器的性能名額設計出相應的模拟濾波器的系統函數H(s),然後由H(s)經變換得到所需要的數字濾波器的系統函數H(z)。常用的變換方法有沖激響應不變法和雙線性變換法。下面使用MATLAB等工具直接生成數字濾波器系數:

  在MATLAB指令行中輸入fdatool打開濾波器設計工具箱,為了便于分析,我們先從設計一個簡單的2階低通濾波器。Design Method用于選擇IIR濾波器還是FIR濾波器,這裡我們選擇IIR濾波器,類型選擇Butterworth,當然也可以選擇其他類型,不同類型的頻率響應不同,選擇後預設的濾波器結構是直接II型。ResponseType用于選擇低通、高通、帶通、帶阻等類型,選擇低通濾波“Lowpass”。Frequency Specifications用于設定采樣頻率以及截止頻率,這裡填入200以及20,即采樣率為200Hz,20Hz以上的頻率将被濾除掉。Fiter Order 選擇濾波器階數,為了簡單起見,先選擇一個2階濾波器做實驗。

  參數設定好後點選Design filter按鈕,将按要求設計濾波器。預設生成的IIR濾波器類型是Direct-Form II,Second-Order Sections(直接Ⅱ型,每個Section是一個二階濾波器),在工具欄上點選Filter Coefficients圖示或菜單欄上選擇Analysis→Filter Coefficients可以檢視生成的濾波器系數。

  

各種濾波器的設計實作

  MATLAB中二階濾波器差分方程公式如下(注意回報項符号為負号): 

  

各種濾波器的設計實作

  高階IIR濾波器的實作是采用二階濾波器級聯的方式來實作的。預設情況下,Filter Coefficients把結果分成多個2階Section顯示,其中還有增益。增益的目的是為了保證計算的精度和系統的穩定性。選擇[edit]→[Convert to Single Section],這時候系數變成我們熟悉的形式:

  按照上面的公式,濾波器差分方程為:y[n] =0.997x[n] +1.994x[n-1] + 0.997*x[n-2] - (1.994)*y[n-1] - (0.994)*y[n-2]

  知道了差分方程的形式并通過MATLAB得到濾波器系數後很容易寫出相應的代碼來實作數字濾波,另外還有一個網站能根據設計名額直接生成C代碼:http://www-users.cs.york.ac.uk/~fisher/mkfilter/

#define NZEROS 2
#define NPOLES 2
#define GAIN   1.482463775e+01

static float xv[NZEROS+1], yv[NPOLES+1];

static void filterloop()
{ 
  for (;;)
   {
     xv[0] = xv[1]; xv[1] = xv[2]; 
        xv[2] = next input value / GAIN;
        yv[0] = yv[1]; yv[1] = yv[2]; 
        yv[2] =   (xv[0] + xv[2]) + 2 * xv[1] + ( -0.4128015981 * yv[0]) + (  1.1429805025 * yv[1]);
        next output value = yv[2];
    }
}
           

原來的網址:https://www.cnblogs.com/21207-iHome/p/7059144.html

相關連結:ARM官方DSP庫IIR濾波器的實作(STM32)link

FIR濾波器c代碼link

IIR濾波器的C++實作link