信號分析與處理概述git
博客對圖片和公式的支持不是很好,相應的word版本見這裏。算法
目錄安全
數字時代... 2函數
數字信號處理的應用... 3工具
頻率——信號的指紋... 5性能
卷積能夠不卷... 8優化
向量運算的啓示... 11ui
濾波器設計征程... 16url
最後一擊——濾波的實現方法... 22spa
縱覽全局... 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系統——出鈔機:若是你今天往出鈔機投幣口(輸入端)投幣一元,它將在接下來的三天,每一天都會從出幣口(輸出端)吐出一元。試問:若是某個月的一、三、4日,你分別投了二、二、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;濾波器結構的選擇,量化對係數的影響)