例說信號處理與濾波囂設計


信號分析與處理概述

博客對圖片和公式的支持不是很好,相應的word版本見這里

目錄

數字時代... 2

數字信號處理的應用... 3

頻率——信號的指紋... 5

卷積可以不卷... 8

向量運算的啟示... 11

濾波器設計征程... 16

最后一擊——濾波的實現方法... 22

縱覽全局... 27

 

 

 

數字時代

        信號處理是對原始信號進行改變,以提取有用信息的過程,它是對信號進行變換、濾波、分析、綜合等處理過程的統稱。數字信號處理是將信號以數字方式表示並處理的理論和技術;模擬信號處理是指用模擬系統對模擬信號進行處理的方法或過程。

        數字信號處理課程的主要內容包括信號分析與處理。兩者並不是孤立的,不同的信號處理方法往往需要選擇不同的信號表示形式。兩者的區別主要表現在,信號處理是用系統改變輸入信號,以得到所期望的輸出信號,如信號去噪;而信號分析往往是通過變換(傅里葉變換、小波變換等),或其它手段提取信號的某些特征,如語音信號的基本頻率,圖像的直方圖等。

        早期的信號處理局限於模擬信號,隨着數字計算機的飛速發展,信號處理的理論和方法得以飛速發展,出現了不受物理制約的純數學的加工,即算法,並確立了數字信號處理的領域。現在,對於信號的處理,人們通常是先把模擬信號變成數字信號,然后利用高效的數字信號處理器(DSP:Digital Signal Processor)或計算機對其進行數字形式的信號處理。

  一般地講,數字信號處理涉及三個步驟:

(1)      模數轉換(A/D轉換):把模擬信號變成數字信號,是一個對自變量和幅值同時進行離散化的過程,基本的理論保證是采樣定理。

(2)      數字信號處理(DSP):包括變換域分析(如頻域變換)、數字濾波、識別、合成等。

(3)      數模轉換(D/A轉換):把經過處理的數字信號還原為模擬信號。通常,這一步並不是必須的。

圖 1數字信號處理基本步驟

數字信號處理的應用

 

圖 2家庭影院(視+聽)

高分辨率圖像、高保真音質

 

圖 3語音識別

噪聲環境下高識別率

 

圖 4圖像增強

更清晰、美觀

 

圖 5無人駕駛

高度智能、安全

 

圖 6醫學成像

更高效、更精確的成像結果

        狹義地講,信號處理可以統稱為濾波,根據不同的要求,選用不同性能的濾波器。在數字信號處理應用中,設計合適的濾波器至關重要。什么是數字濾波器呢?數字濾波器就是數字信號處理(Digital Signal Processing)算法,或者是數字信號處理器件(Digital Signal Processor)。什么是數字信號處理算法呢?我們需要借助基本的數學工具和方法。

        首先回到信號處理的根本目的:用濾波器改變輸入信號,以期得到理想的輸出信號,如果輸入信號用$x\left[ n \right]$表示,輸出信號用$y\left[ n \right]$表示,則數字信號處理或濾波可用如下框圖表示:

 

圖 7數字信號濾波圖示

        上述框圖並沒有給出數字信號處理算法的具體實現方法,但提供了數字信號處理的基本數學思想:通過系統將$x\left[ n \right]$和$y\left[ n \right]$進行關聯。在數學上描述$x$和$y$之間關系的手段有很多,如函數$y = f\left( x \right)$,方程組$Ax = y$等,從數學角度來理解,如果$f\left(  \cdot  \right)$為不同映射,即使同樣的自變量$x$,也會得到不同的因變量$y$;如果系數矩陣$A$不同,同樣的$x$經變換之后,將得到不同的$y$。在數字信號處理課程中,描述輸入輸出信號關系的基本數學工具是差分方程:

\[\sum\limits_{k = 0}^Q {{a_k}y\left[ {n - k} \right]}  = \sum\limits_{k = 0}^P {{b_k}x\left[ {n - k} \right]} \]                                                                  

令$N = \max \left( {P,Q} \right)$,上述差分方程可寫為

\[\sum\limits_{k = 0}^N {{a_k}y\left[ {n - k} \right]}  = \sum\limits_{k = 0}^N {{b_k}x\left[ {n - k} \right]} \]                                                                  

如果僅局限於基礎(經典)的數字信號處理算法研究,全部內容都是圍繞這個線性常系數差分方程(Linear Constant-Coefficient Difference Equation,LCCDE)展開的。那么,我們需要研究LCCDE什么呢?很顯然,我們可以將LCCDE看成一個系統,它描述了輸入$x\left[ n \right]$和輸出$y\left[ n \right]$之間的關系。哪些參數決定這個系統的性能呢?方程中除了$x\left[ n \right]$和$y\left[ n \right]$,還有三個參數:方程階數$N$,系數${a_k}$和${b_k}$——數字濾波器設計的根本任務就是確定這三個參數——目標非常明確!!!

         從何下手呢?如何判定所設計的濾波器符合預期呢?迷茫中ing…

頻率——信號的指紋

         烈日當空,窗外的知了熱得撕心裂肺地吼叫

 

聲音特點:又大又尖,怎叫人不心煩意亂?!

大:能量大,或者信號幅度大(聲壓級超過120dB即達到痛閾);

尖:頻率高,即知了的叫聲中包含了豐富的高頻成分,因此聽起來很“刺耳”。

 

圖 8知了聲的頻譜圖(橫坐標:頻率(Hz);縱坐標:幅度(dB))

 

圖 9 聽覺曲線

 

圖 10 聲音頻率范圍

可見,幅度和頻率是聲音信號的主要參數。諸如“低音炮”、“高音喇叭”、“男低音”和“女高音”都是從幅度和頻率去描述聲音信號的,因此,分析信號的頻率特性是信號處理領域的重要內容。

        分析信號的頻率特性無非就是想知道信號包含了哪些頻率成分,各頻率成分的大小是多少。傅里葉分析完美地解決了這個問題。在信號與系統課程中,我們通常將傅里葉分析分為傅里葉級數和傅里葉變換,前者用來對付周期信號,后者用來處理非周期信號,但無論是傅里葉級數,還是傅里葉變換(當然,傅里葉級數也可以納入到傅里葉變換體系中),它們的原理或宗旨都一樣:將一般的信號分解為基本信號的線性組合

(連續周期信號) \[\tilde x\left( t \right) = \sum\limits_{k =  - \infty }^{ + \infty } {{a_k}{e^{jk{\omega _0}t}}} \]                             

(離散非周期序列) \[x\left[ n \right] = \frac{1}{{2\pi }}\int_{\left\langle {2\pi } \right\rangle } {X\left( {{e^{j\omega }}} \right)} {e^{j\omega n}}d\omega \]                                                          

以式為例,等式左邊是一般的(滿足收斂條件的)周期信號,而右邊則是頻率為$k{\omega _0}$、幅度為${a_k}$的虛指數信號${e^{jk{\omega _0}t}}$的線性組合。

        現在可以談論一下濾波的概念了。假設式中$\tilde x\left( t \right)$就是知了發出的“嗞哇嗞哇……”沒完沒了的周期信號,現在我們想把煩人的高頻成分去掉,最直觀的想法就是需要設計一個濾波器,這個濾波器可以讓較低頻率的信號順利通過,同時又能阻止較高頻率的信號,這就是所謂的低通濾波器。

卷積可以不卷

        再回到線性常系數性差分方程,參數$N$,${a_k}$和${b_k}$完全決定了方程所描述的系統的所有特性。什么?難道與輸入$x\left[ n \right]$和輸出$y\left[ n \right]$沒關系?對,沒有關系!電阻是一個系統,其阻值僅與自身的材料及結構有關,雖然有關系式$R = v\left( t \right)/i\left( t \right)$,事實上,即使兩端沒有電壓,電阻依然存在;再比如理想的線性放大電器,它的增益僅取決於內部結構,而與輸入輸出無關,但為了測量放大器的增益(放大倍數),我們可以在輸入端接入幅度為$i$的信號,然后測量輸出信號的幅度$o$,這樣就可以得到放大倍數$g = \frac{o}{i}$,更特殊地,如果取$i = 1$,此時輸出信號的幅度就是放大器的增益,即$g = o$。類似的概念推廣到LCCDE描述的LTI系統,我們如何獲得這個系統的特性呢?輸入——輸出描述法,即令輸入$x\left[ n \right]$取某種特殊值時,計算(或測量)系統的輸出$y\left[ n \right]$。那么,什么樣的$x\left[ n \right]$算特殊呢?單位脈沖!

                                           

\[\delta \left[ n \right] = \left\{ \begin{array}{l}
1,\;\;\;n = 0\\
0,\;\;n \ne 0
\end{array} \right.\]

 

也就是說,令$x\left[ n \right] = \delta \left[ n \right]$,此時系統的輸出就是所謂的單位脈沖響應$h\left[ n \right]$。再與放大器的例子對比一下:輸入信號幅度$i = 1$,輸出信號的幅度$o$就是放大倍數(放大器的重要指標,從應用者角度而言,其實就是唯一關心的指標)。我們有理由相信,對於LCCDE描述的LTI系統,得到了單位脈沖響應$h\left[ n \right]$,就能夠掌握系統的全部特性(因果性、穩定性、頻率選擇性等)。何以見得呢?之后將逐步解答。

         現在,我們假設已經知道了LTI系統的單位脈沖響應$h\left[ n \right]$,對於任意輸入$x\left[ n \right]$,如何求系統的輸出$y\left[ n \right]$呢?其實就是求濾波后的信號。首先,我們要建立已知和需求之間的聯系。已知的是 ,需求是 。

 

圖 11 單位脈沖響應

事實上,任意序列$x\left[ n \right]$很容易用$\delta \left[ n \right]$的移位、加權的線性組合來表示:$x\left[ n \right] = \sum\limits_{k =  - \infty }^{ + \infty } {x\left[ k \right]\delta \left[ {n - k} \right]} $。

 

圖 12 序列的單位脈沖表示

結合系統的線性和時不變性,有

                                            

式中最后一個等式\[y\left[ n \right] = \sum\limits_{k =  - \infty }^{ + \infty } {x\left[ k \right]h\left[ {n - k} \right]} \]就是卷積和,記作$y\left[ n \right] = x\left[ n \right]*h\left[ n \right]$,表明LTI系統的(零狀態)響應$y\left[ n \right]$是單位脈沖響應$h\left[ n \right]$的移位、加權、求和。這句話也描述了求$y\left[ n \right]$的步驟。根據圖 11,我們可以假想有這樣的一個LTI系統——出鈔機:如果你今天往出鈔機投幣口(輸入端)投幣一元,它將在接下來的三天,每一天都會從出幣口(輸出端)吐出一元。試問:如果某個月的1、3、4日,你分別投了2、2、3元,那么,出鈔機每天的輸出是多少元呢?不妨用圖來說明一下。

 

圖 13 卷積和的圖解

圖解結果告訴我們,出鈔機在2-7日分別吐出2,2,4,5,5,3元。圖解的過程包含了乘積與求和(“積”與“和”),但並有體現出“卷”(翻轉)這一操作。如果只想求某一天(比如5日)出鈔口吐出多少錢,此時就要用另一種方法,即許多教材中描述的步驟:

(1)      變量替換:$x\left[ n \right] \to x\left[ k \right],h\left[ n \right] \to h\left[ k \right]$

(2)      將$x\left[ k \right]$或$y\left[ k \right]$翻轉

(3)      移位、相乘、相加

以上步驟包含了“卷積和”所有的操作(卷——翻轉;積——相乘;和——相加)。

        圖解過程是根據線性時不變系統的定義導出的一種結果,是系統特性的直接反映。卷積和是信號與系統、數字信號處理中最重要的公式之一,它描述了LTI系統輸入$x\left[ n \right]$、輸出$y\left[ n \right]$以及單位脈沖響應$h\left[ n \right]$之間的關系,已知三者中的任何兩個,就可以確定第三者,於是就有以下應用場合:

(1)      已知輸入$x\left[ n \right]$和系統單位脈沖響應$h\left[ n \right]$,求輸出$y\left[ n \right]$,即用確定的系統對輸入信號濾波處理;

(2)      已知輸出$y\left[ n \right]$和系統單位脈沖響應$h\left[ n \right]$,求輸入$x\left[ n \right]$;

(3)      已知輸入$x\left[ n \right]$和輸出$y\left[ n \right]$,求系統單位脈沖響應$h\left[ n \right]$。

現在,我們將注意力集中到卷積和公式上來,公式重寫如下

\[y\left[ n \right] = \sum\limits_{k =  - \infty }^{ + \infty } {x\left[ k \right]h\left[ {n - k} \right]} \]                                                                                    

卷積和只包含了移位、數乘和相加運算,看來,數字信號處理的計算十分簡單。如果再上升一個層次,卷積和能很直觀解釋系統如何改變輸入信號的嗎?從圖 13的結果很難看出系統是如何將$x\left[ n \right]$變成$y\left[ n \right]$的,而且也很難說明這種變化意味着什么,因此,卷積和在解釋系統行為特性時很不直觀,這是卷積和運算本身決定的。

向量運算的啟示

        了解運算背后的物理或幾何含義對理解問題的本質至關重要。例如向量的乘法和加法:設兩個向量$\vec A = {x_1} + i{y_1}$,$\vec B = {x_2} + i{y_2}$,向量的加法符合平行四邊形法則,從圖 14很容易看出兩個向量相加的幾何意義,而相應的代數運算也很簡單——對應分量相加即可,即有

        $\vec C = \vec A + \vec B = \left( {{x_1} + {x_2}} \right) + i\left( {{y_1} + {y_2}} \right)$   

但如果要求兩個向量的乘法呢?代數運算的結果是

相比兩個向量的加法,向量的乘法運算要復雜一些,更重要的是,根據運算結果,我們很難看清向量乘法的幾何意義。如果將向量$\vec A$和$\vec B$用極坐標表示,情況又會如何呢?設

                 

                                  

則兩個向量的乘法

                             

計算簡單,幾何意義明確——模相乘,相位相加。

 

圖 14 向量加的直角坐標表示

 

圖 15 向量乘法的極坐標表示

         向量運算的例子告訴我們,選擇不同的坐標系,不僅影響運算的復雜度,在解釋運算的幾何意義時也各有千秋。上例告訴我們,如果是向量的加法,直角坐標系比極坐標系方便;如果是向量的乘法,很顯然,極坐標系比直角坐標系方便。

         回到數字信號處理的話題,卷積和是讓無數人困惑的公式,然而,它又是經典數字信號處理算法的根源。既然卷積和運算就是濾波,我們如何評判濾波的效果呢?從什么角度理解系統的濾波行為更好呢?

         再想想知了的叫聲,之所以煩人,是因為包含了大量的高頻分量。看來,用頻率這一參數來解釋信號特性很符合人的直觀感覺。我們有更好的方式來洞悉卷積和的物理意義嗎?能不能站在頻(率)域的角度來解釋卷積和呢?當然可以,因為我們有卷積定理(性質):

通過傅里葉變換,將時域中的卷積和運算換成了頻域中的相乘運算。那么頻域中的相乘運算有什么好處呢?不要忘了,我們主要是為了直觀解釋濾波的行為和特性。

         圖 16是一段濾波前知了聲$x\left[ n \right]$的時域波形,單從圖形上看,似乎很難說出這一段信號的特點,運用傅里葉變換,得到$x\left[ n \right]$的幅度譜$\left| {X\left( {{e^{j\omega }}} \right)} \right|$如圖 17所示,很明顯,該圖說明信號$x\left[ n \right]$包含了豐富的高頻成分。現在,我們希望設計一個濾波器,可以濾除2500Hz以上的頻率分量,目的是僅保留紅框內的頻率分量,因此要求濾波器的頻率響應(幅頻響應)是


濾波器的幅頻特性如圖 18所示,截止頻率${f_c} = 2500$Hz。由卷積定理可知,輸出信號的幅度譜為

\[\left| {Y\left( {{e^{j\omega }}} \right)} \right| = \left| {X\left( {{e^{j\omega }}} \right)} \right|\left| {H\left( {{e^{j\omega }}} \right)} \right|\]                                                                   

從圖形上來看就更直觀了:圖 17與圖 18相乘,得到了濾波后信號的幅度譜,濾波前、后信號頻譜的變化一目了然,很顯然,它是按照濾波器頻率響應$H\left( {{e^{j\omega }}} \right)$所規定的形狀去改變的。而對比濾波前、后的時域波形,很難解釋信號的什么特性被改變了。

         在上述的討論中,我們只關注幅度譜,實際中,相位譜也必須考慮,更完整的表達式為

對比極坐標系下兩個向量的乘法,能找到相似之處嗎?——模相乘、相位相加。如果將卷積和$y\left[ n \right] = x\left[ n \right]*h\left[ n \right]$看作直角坐標系下兩個向量的乘法,那么\[Y\left( {{e^{j\omega }}} \right) = X\left( {{e^{j\omega }}} \right)H\left( {{e^{j\omega }}} \right)\]就類似於極坐標系下兩個向量的乘法——運算簡單、物理意義直觀。[通過向量乘法運算的例子,我們可以看到,向量的表示方式起到了關鍵性的作用;同樣地,信號也有不同的描述方式,如時域、頻域、復頻域,不同的表示方法都是為了使分析問題更簡單、物理意義更明確]

 

圖 16濾波前知了聲$x\left[ n \right]$時域波形

 

圖 17濾波前知了聲的幅度譜$\left| {X\left( {{e^{j\omega }}} \right)} \right|$ (紅框是希望保留的低頻分量)

 

圖 18低通濾波器幅頻特性$\left| {H\left( {{e^{j\omega }}} \right)} \right|$ (藍色線)

 

圖 19濾波后知了聲的幅度譜$\left| {Y\left( {{e^{j\omega }}} \right)} \right|$

 

圖 20濾波后知了聲$y\left[ n \right]$時域波形

濾波器設計征程

         借助系統的頻率響應$H\left( {{e^{j\omega }}} \right)$,可以很方便地解釋濾波器的特性(主要是指頻率選擇性)。有什么定量指標來描述頻率選擇性嗎?通常有四個指標——橫坐標兩個,縱坐標兩個。以低通濾波器為例來說明。如圖 21所示,橫坐標兩個指標為通帶截止頻率${\omega _p}$和阻帶截止頻率${\omega _s}$,縱坐標兩個指標為通帶衰減${A_p}$和阻帶衰減${A_s}$。

 

圖 21數字低通濾波器指標

         通常而言,濾波器設計就是指根據應用的需求,提出合理的濾波器指標(通帶截止頻率和衰減,阻帶截止頻率和衰減),然后借助濾波器設計工具得到濾波器參數(系數)。濾波器系數?沒聽說過啊,是什么東西?其實我們早見過面了,就是差分方程中的${a_k}$和${b_k}$!早就說過,數字濾波器設計要不忘初心,根本任務就是確定這三個參數——方程的階數$N$,系數${a_k}$和${b_k}$。

         如何建立起濾波器指標和濾波器系數之間的聯系呢?很顯然,濾波器的指標約束着其頻率響應$H\left( {{e^{j\omega }}} \right)$,而$H\left( {{e^{j\omega }}} \right)$與LCCDE的階數$N$,系數${a_k}$和${b_k}$直接相關。傅里葉變換又該出場了。對差分方程兩邊取傅里葉變換得

\[\sum\limits_{k = 0}^N {{a_k}{e^{ - jk\omega }}Y\left( {{e^{j\omega }}} \right)}  = \sum\limits_{k = 0}^N {{b_k}{e^{ - jk\omega }}X\left( {{e^{j\omega }}} \right)} \]                                                

從而可得頻率響應

\[H\left( {{e^{j\omega }}} \right) = \frac{{Y\left( {{e^{j\omega }}} \right)}}{{X\left( {{e^{j\omega }}} \right)}} = \frac{{\sum\limits_{k = 0}^N {{b_k}{e^{ - jk\omega }}} }}{{\sum\limits_{k = 0}^N {{a_k}{e^{ - jk\omega }}} }}\]                              

易見,頻率響應$H\left( {{e^{j\omega }}} \right)$完全由$N$,${a_k}$和${b_k}$確定。綜上可知,濾波器設計就是如何根據濾波器指標求解濾波器系數的過程,從數學角度來看,就是函數逼近和數值優化的過程。經典濾波器設計理論發展較完備(巴特沃斯、切比雪夫I、切比雪夫II、橢圓……,各自的特點是什么?更多內容,請點這里),許多教科書都有詳細討論,此處不再贅述,我們的重點是要借助現代化的設計工具,輕松完成設計任務並實施濾波處理。此處僅以MATLAB工具為例,並通過兩種方式來實現濾波器設計——腳本代碼和可視化方法。

         需求:設計一個低通濾波器來處理知了聲,通帶截止頻率${F_p} = 2000$Hz,通帶衰減${A_p} = 0.1$dB,阻帶截止頻率${F_s} = 2500$Hz,通帶衰減${A_p} = 50$dB。

乍一看,這些指標與圖 21中的指標完全不同,實際需求的指標往往同本例,頻率指標為模擬頻率,衰減指標以dB為單位,而設計數字濾波器時,往往需要數字頻率指標。如何進行指標轉換呢?直接用公式計算${\omega _p} = 2\pi {F_p} = 4000\pi $,${\omega _s} = 2\pi {F_s} = 5000\pi $嗎?圖 21告訴我們,無論通帶截止頻率,還是阻帶截止頻率都不會超過$\pi $。難道最大的數字角頻率就是$\pi $嗎?為什么?這個問題同樣令許多人困惑。如何衡量數字頻率的大小呢?先考慮一個簡單的數字信號:$x\left[ n \right] = \cos \left( {\omega n} \right)$,針對$\omega $取不同的值,分別畫出對應的波形如下:

 

圖 22$\cos \left( {\omega n} \right)$波形圖

振盪得越厲害,意味着頻率越高,這是符合常理的。上圖中的9個波形,哪個振盪得最厲害呢?第二排中間那個——+1和-1交替,而此時$\omega  = \pi $。而且還發現,$\omega  = 0$和$\omega  = 2\pi $的波形一樣,並不是$\omega $的值越大,振盪得越快。如果是連續時間信號$x\left( t \right) = \cos \left( {2\pi ft} \right) = \cos \left( {\Omega t} \right)$,大家都知道,隨着$\Omega $的增大,波形會振盪得越快。從連續時間信號到離散時間信號,是什么原因導致兩者出現如此大的差異呢?通過對采樣過程的探索,我們便可理解其中的奧妙。設以時間間隔${T_s}$對$x\left( t \right) = \cos \left( {\Omega t} \right)$采樣,這樣便得到

   $x\left( {n{T_s}} \right) = \cos \left( {\Omega n{T_s}} \right) = \cos \left( {\omega n} \right)$

因此有

                                              $\omega  = \Omega {T_s} = \Omega /{f_s}$                                     

其中${f_s} = 1/{T_s}$為采樣頻率,$\Omega $為模擬角頻率,$\omega $為數字角頻率。結論是:數字頻率是模擬頻率關於采樣頻率的歸一化。

         根據Nyquist采樣定理,當采樣頻率大於信號最高頻率2倍時,可以由樣點完全恢復原來的信號。我們不妨假設信號的最高頻率正好是采樣頻率的一半,即\[{f_{\max }} = {f_s}/2\],對應的最高模擬角頻率${\Omega _{\max }} = 2\pi {f_{\max }} = \pi {f_s}$,代入式得

                       ${\omega _{\max }} = {\Omega _{\max }}/{f_s} = \pi {f_s}/{f_s} = \pi $               

這也證明了為什么最高數字角頻率為$\pi $。(如果不滿足Nyquist采樣條件又會怎樣呢?事實上並不影響結論成立)。關於各種頻率之間的關系的討論,可以參考這里(注意文中“fdtool工具中歸一化頻率為什么最大只到0.5的原因”,應改為“最大只到1的原因”。)

         再回到濾波器設計題目,第一步,需要將模擬頻率指標轉換為歸一化數字頻率指標,轉換公式是

                                                       \[\omega  = 2f/{f_s}\;\;\;\;(\pi )\]                                               

很顯然,我們需要知道采樣頻率${f_s}$。知了聲的采樣頻率${f_s} = 11025$Hz。將模擬頻率指標代入式計算出對應的歸一化數字頻率指標

這樣,我們就得到了數字域的四個指標:${\omega _p},{A_p},{\omega _s},{A_s}$。如何從這四個指標去計算濾波器系數呢?有現成的公式套用,即許多教科書上所說的各類濾波器原型。我們選擇橢圓型濾波器為例。MATLAB代碼如下:

clc;

close all

fs=11025;                           %采樣頻率(Hz)

Fp = 2000;                         %通帶截止頻率(Hz)

Fs = 2500;                             %阻帶截止頻率(Hz)

Ap = 0.1;                               %通帶衰減(dB)

As = 50;                                %阻帶衰減(dB)

wp=2*Fp/fs;                          %歸一化通帶截止頻率

ws=2*Fs/fs;                           %歸一化阻帶截止頻率 

[N,Wp]=ellipord(wp,ws,Ap,As);      %確定帶通濾波器的階數和截止頻率 

[b,a]=ellip(N,Ap,As,Wp);               %確定濾波器系數 

[h,w]=freqz(b,a);                      %求數字帶通濾波器的頻率響應 

%以下為繪圖命令,繪制帶通濾波器的幅頻響應 

figure;

plot(w*fs/(2*pi),20*log10(abs(h)/max(abs(h))));

axis([0,fs/2,-100,0]);

title('數字低通濾波器的幅度響應');

xlabel('頻率(Hz)');

ylabel('幅度(dB)');

grid

 

濾波器系數

a = [1  -2.98876196757509  5.41154092244290  -6.18465137960809        4.94650037623018         -2.65349822687766  0.903727225595414  -0.150115115698030]

b = [0.0204237714181223     0.0185281305134523    0.0518202070683316         0.0515988082549051    0.0515988082549052    0.0518202070683315         0.0185281305134523    0.0204237714181222]

分別對應式中的${a_k}$和${b_k}$,得到了這兩個參數,濾波器設計基本上算完成了。

         如果你掌握了濾波器設計的基本理論,但又不想寫代碼,你可以利用FDATool輕松完成濾波器設計的全過程。

 

在命令窗口輸入:fdatool,回車,就可以看到下圖所示的界面:

 

然后動動鼠標就可以完成濾波器設計了。針對本例,我們按下圖紅框所示設定指標,在完成指標設定之后,點“Design Filter”按鈕即完成設計。關於濾波器的所有信息,都可以通過菜單或工具欄獲得。注意”Current Filter Information”部分,它描述了當前所設計出的濾波器基本信息,包括結構、階次、穩定性等。有一個問題值得思考:濾波器的結構對濾波器的工程實現有什么影響呢?成本、穩定性、抗噪聲性能,這些都與結構有關,因此,掌握濾波器各種結構的優缺點也十分重要。

         很顯然,用FDATool設計濾波器十分簡單!無論采用什么方法,都不要忘記濾波器設計的根本目標——得到濾波器系數。關於FDATool更多內容,請點這里這里

         當濾波器設計完成之后,我們該考慮如何用所得到的系數對輸入信號進行濾波了。

 

最后一擊——濾波的實現方法

         當濾波器系數${a_k}$和${b_k}$確定之后,方程也就完全確定了,所謂的濾波,就是要對給定的輸入$x\left[ n \right]$,求系統的響應$y\left[ n \right]$。MATLAB提供了幾種濾波實現函數:

conv:線性卷積,可以用來實現濾波

filter:濾波,但是輸出點數和輸入點數相同,其余的存在內部狀態中,以便處理后續輸入

filtfilt:零相位濾波,輸出通過濾波器后再反向通過濾波器,消除相位影響

fftfilt:利用基於FFT的重疊相加法對數據進行濾波,這種頻域濾波技術只對FIR濾波器有效

 

完整例子:用MATLAB讀入知了聲的音頻文件,畫時域波形和頻譜,設計濾波器,對音頻文件進行濾波,最后畫濾波后的信號時域波形和頻譜。程序如下:

clc;

close all

[xn, fs] = wavread('cicada.wav');   %讀wav文件(知了聲),獲得樣點值xn和采樣頻率fs

 

%計算信號xn的頻譜

xn_FFT = fft(xn);                      %FFT頻譜分析

xn_FFT_AMP = abs(xn_FFT);            %求xn的幅度譜

xn_FFT_AMP_db = 20*log10(xn_FFT_AMP/max(xn_FFT_AMP));   %用對數表示

 

%畫xn時域波形

figure

n = 1:length(xn);                   %生成樣點橫坐標向量

plot(n,xn);                      %以n為橫坐標,畫xn

axis([1  length(xn) -1 1])      %設定坐標軸顯示范圍

xlabel('樣點');                       %設定x坐標標記

ylabel('幅度');                       %設定y坐標標記

title('知了聲時域波形');   %設定標題

 

%畫xn的幅度譜(對數形式)

figure

faxis = (0:length(xn)-1)*fs/length(xn);          %生成橫坐標(頻率軸)刻度,FFT的頻率范圍[0 fs]

plot(faxis,xn_FFT_AMP_db);                        %以faxis為橫軸畫xn頻譜圖

axis([0  fs/2 -100 0])     %設定顯示范圍,由於FFT頻譜具有對稱性,因此只顯示前半部分

xlabel('頻率(Hz)');

ylabel('幅度(dB)');

title('知了聲幅度譜');

 

% 設計低通濾波器

Fp = 2000;             %通帶截止頻率(Hz)

Fs = 2500;             %阻帶截止頻率(Hz)

Ap = 0.1;             %通帶衰減(dB)

As = 50;                %阻帶衰減(dB)

wp=2*Fp/fs;          %歸一化通帶截止頻率

ws=2*Fs/fs;           %歸一化阻帶截止頻率

[N,Wp]=ellipord(wp,ws,Ap,As);          %確定帶通濾波器的階數和邊緣頻率

[b,a]=ellip(N,Ap,As,Wp);                   %確定濾波器系數

[h,w]=freqz(b,a);                             %求數字帶通濾波器的頻率響應

%以下為繪圖命令,繪制帶通濾波器的幅頻響應

figure;

plot(w*fs/(2*pi),20*log10(abs(h)/max(abs(h))));

axis([0,fs/2,-100,0]);

title('數字低通濾波器的幅度響應');

xlabel('頻率(Hz)');

ylabel('幅度(dB)');

grid

 

%利用設計的濾波器對xn進行濾波,得到濾波輸出yn

yn = filter(b,a,xn);                                    %濾波函數,b和a為濾波器系數,xn是輸入信號

wavwrite(yn,fs,8,'cicada_LPFiltered.wav');  %保存濾波后的信號

 

%畫濾波后的信號yn時域波形

figure

n = 1:length(yn);

plot(n,yn);

axis([1  length(yn) -1 1])

xlabel('樣點');

ylabel('幅度');

title('低通濾波后知了聲時域波形');

 

%計算濾波后信號yn的頻譜

yn_FFT = fft(yn);

yn_FFT_AMP = abs(yn_FFT);

yn_FFT_AMP_db = 20*log10(yn_FFT_AMP/max(yn_FFT_AMP));

 

figure

faxis = (0:length(yn)-1)*fs/length(yn);

plot(faxis,yn_FFT_AMP_db);

axis([0  fs/2 -100 0])

xlabel('頻率(Hz)');

ylabel('幅度(dB)');

title('濾波后知了聲幅度譜');

 

結果:

 

圖 23知了聲時域波形

 

圖 24知了聲頻譜(幅度頻)

 

圖 25低通濾波器頻率響應(幅頻響應)

 

圖 26低通濾波后知了聲時域波形

 

圖 27濾波后知了聲頻譜圖(幅度譜)

縱覽全局

經典信號處理課程的主要內容:

(1)      信號的表示方法(時域表示、頻域表示、復頻域表示)

(2)      系統的描述方法(LCCDE、單位脈沖響應、頻率響應、系統函數、零極點圖)

(3)      濾波器設計方法(代碼和可視化方法)

(4)      濾波的實施方法(濾波器類型的選擇——IIR、FIR;濾波器結構的選擇,量化對系數的影響)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM