也是有一段時(shí)間不寫博客了啊,主要是這學(xué)期的實(shí)驗(yàn)課太多,每天都是在寫預(yù)習(xí)報(bào)告,實(shí)驗(yàn)報(bào)告中度過(guò),也快到考試月了啊,感覺又要忙起來(lái)了,今天就抽點(diǎn)時(shí)間來(lái)開個(gè)頭,開什么頭呢?對(duì)!就如標(biāo)題所示,濾波器。
這段時(shí)間也有很多網(wǎng)友加小墨,首先感謝廣大網(wǎng)友的支持,你們的支持是我前進(jìn)的最大動(dòng)力。很多網(wǎng)友加我的原因我總結(jié)了一下,可能是最近是畢業(yè)季嘛,大部分人都在搞畢業(yè)設(shè)計(jì),所以~還有一部分人是一些初學(xué)者,主要是問(wèn)一下關(guān)于入門和方向的問(wèn)題,還有就是一些有過(guò)經(jīng)驗(yàn)的研究生或者是公司在職人員。在這里我想說(shuō)的是,大家共同探討是沒(méi)有什么問(wèn)題的,只不過(guò)希望大家不要一有問(wèn)題就將代碼粘貼復(fù)制過(guò)來(lái)讓別人給你解析,代碼學(xué)習(xí)本來(lái)就是一個(gè)重要的過(guò)程,遇到問(wèn)題是很正常的,大家要學(xué)著怎么通過(guò)查資料,利用網(wǎng)絡(luò)來(lái)解決問(wèn)題,而不是直接把編譯器生成的錯(cuò)誤報(bào)告粘貼過(guò)來(lái),問(wèn)怎么回事,所以小墨對(duì)于這些網(wǎng)友是不給予回答的,希望大家諒解~當(dāng)然也不排除一些比較高端的技術(shù)問(wèn)題,畢竟小墨接觸這東西也不久,所以很多東西也還是不會(huì)哈,所以幫不了多少忙也請(qǐng)大家諒解~
很多網(wǎng)友問(wèn)過(guò)方向問(wèn)題,感覺自己無(wú)從下手,有的網(wǎng)友也是,買了板子之后寫了一些例程后就不知道該干什么了。我覺得,手里有項(xiàng)目的朋友還好,隨著項(xiàng)目的進(jìn)行可以隨用隨學(xué),這樣效率是最高的,至于手里沒(méi)有項(xiàng)目的大學(xué)生,像我一樣的,對(duì)于這些朋友我的建議就是,千萬(wàn)不要忽視理論的學(xué)習(xí)!我們學(xué)校的一個(gè)學(xué)弟問(wèn)過(guò)我改怎么學(xué),他現(xiàn)在大二,我還是覺得,大二這個(gè)階段,最重要的還是理論??赡艽蠹叶紩?huì)覺得理論很枯燥,不如自己動(dòng)動(dòng)手做點(diǎn)東西,其實(shí)是不正確的,只有靠著強(qiáng)大的理論支撐,你才能走得更遠(yuǎn),才會(huì)有機(jī)會(huì)成為一名合格的工程師,而不僅僅是一名技術(shù)人員。所以,學(xué)弟學(xué)妹們,請(qǐng)重視好自己的專業(yè)課學(xué)習(xí)。
在接下來(lái)的幾個(gè)月的時(shí)間,小墨將跟大家一起來(lái)學(xué)習(xí)基于FPGA的信號(hào)處理與通信技術(shù)這些方面的知識(shí),因?yàn)槲疫€是覺得,包括我們老師給的建議,F(xiàn)PGA主要的應(yīng)用領(lǐng)域,還是信號(hào)處理與通信,所以大家不要覺得買了一塊板子,寫了點(diǎn)東西就已經(jīng)學(xué)會(huì)了,要永遠(yuǎn)保持一種求知欲。對(duì)于這方面的知識(shí),我接觸的也不是很多,僅僅是在上課的時(shí)候接觸過(guò)理論而已,說(shuō)白了,這方面的知識(shí)我是不會(huì)的,因此,想從事這方面工作的朋友可以跟小墨一起學(xué)習(xí)哈,這可是個(gè)漫長(zhǎng)的過(guò)程。
看這篇以及后續(xù)文章的朋友,小墨已經(jīng)默認(rèn)大家已經(jīng)有了較好的理論基礎(chǔ),包括信號(hào)與系統(tǒng),數(shù)字信號(hào)處理,通信原理,matlab的使用等,有些東西將一筆帶過(guò),所以基礎(chǔ)不好的朋友請(qǐng)自行回去補(bǔ)課~
好,這樣,我先給大家出個(gè)題目,我們按照這個(gè)題目來(lái)開始學(xué)習(xí)
利用matlab設(shè)計(jì)一個(gè)線性相位FIR帶通濾波器,并在FPGA上實(shí)現(xiàn)。要求:
1、濾波器指標(biāo):過(guò)渡帶帶寬分別為100~300HZ,500~700HZ,阻帶允許誤差為0.02,通帶允許誤差為0.01,采樣頻率為2000HZ,量化位數(shù)為12bit
2、設(shè)計(jì)方法,要求利用kaiserord函數(shù)獲取濾波器參數(shù),并設(shè)計(jì)成等波紋最優(yōu)濾波器
3、要求對(duì)疊加信號(hào)進(jìn)行濾波,疊加信號(hào)是由頻率分別為100 ,400,800HZ的正弦波疊加而成,要求將信號(hào)通過(guò)FPGA濾波后的用modelsim仿真,并在matlab中驗(yàn)證濾波器的正確性
很多朋友一看,這是嘛呀?即使當(dāng)時(shí)數(shù)字信號(hào)處理學(xué)的還算可以,但是真正到工程中就傻了眼了,好吧,半個(gè)月前我也是這種狀態(tài),下面我就記錄一下這段時(shí)間學(xué)這部分知識(shí)的過(guò)程吧
1、嘛叫濾波器?
我們所說(shuō)的當(dāng)然就是數(shù)字濾波器了,官方解釋就是輸入輸出都是數(shù)字信號(hào),通過(guò)數(shù)值運(yùn)算處理改變輸入信號(hào)所含頻率成分相對(duì)比例,或者濾除某些頻率成分的數(shù)字器件或者程序。對(duì)于經(jīng)典濾波器而言,就是利用了當(dāng)信號(hào)有用成分的頻帶與想要濾除的信號(hào)的頻帶是不疊加的,占據(jù)不同頻率帶的這一特點(diǎn),利用經(jīng)典濾波器,包括低通,高通,帶通,帶阻濾波器,設(shè)計(jì)制定的通帶,濾除不需要的信號(hào)成分,得到我們想要頻帶信號(hào)的過(guò)程。但是對(duì)于信號(hào)的頻帶相互疊加的情況,經(jīng)典濾波器就無(wú)能為力了,就需要用到現(xiàn)代濾波器,當(dāng)然也就更高大上了,我水平有限,也不知道他是嘛了~
而我們常用的濾波器就是選頻濾波器了,就像上面那個(gè)我給大家出的題目就是一個(gè)選頻濾波器。學(xué)過(guò)數(shù)字信號(hào)處理的同學(xué)應(yīng)該知道,我們要觀察信號(hào)的頻域,需要將其進(jìn)行傅里葉變換,得到信號(hào)的頻率響應(yīng),這個(gè)響應(yīng)我們用H(e^jw)表示,頻率響應(yīng)又可以分為幅頻響應(yīng)與相頻響應(yīng),幅頻響應(yīng)表示的是信號(hào)經(jīng)過(guò)濾波器濾波后頻率成分幅度的衰減情況,相頻響應(yīng)表示的是信號(hào)經(jīng)濾波器濾波后的延時(shí)情況,因此我們往往通過(guò)這兩個(gè)特性來(lái)觀察我們的濾波器是否符合我們的設(shè)計(jì)要求。
下面先看一個(gè)帶通濾波器的設(shè)計(jì)指標(biāo)圖
經(jīng)典濾波器的指標(biāo)主要就分為4個(gè),即通帶截止頻率,阻帶截止頻率,通帶最大衰減,阻帶最小衰減。關(guān)于這4個(gè)參數(shù)的意思想必大家都已經(jīng)很熟了,要不然信號(hào)處理這門課**的是白學(xué)了,這里就不再多說(shuō),我們直接看之前的題目,題目要求我們的過(guò)渡帶頻率分別為100~300HZ,500~700HZ,對(duì)應(yīng)帶通濾波器的參數(shù)我們可以很清楚的知道我們要設(shè)計(jì)的濾波器的截止頻率,即
通帶截止頻率為300HZ,500HZ,阻帶截止頻率為100HZ,700HZ。即我們的通帶是300~500HZ,而我要求的的信號(hào),是由100,400,800HZ頻率的三個(gè)信號(hào)疊加而成,因此,若這個(gè)信號(hào)通過(guò)濾波器之后,應(yīng)該是阻帶內(nèi)的信號(hào)濾除,只保留通帶內(nèi)的信號(hào)才對(duì),所以最后我們要驗(yàn)證的就是,通過(guò)濾波器濾波后的信號(hào)的波形,要跟信號(hào)頻率為400HZ的信號(hào)波形一致,才證明我們的濾波器設(shè)計(jì)正確。好了,好像我們根據(jù)這個(gè)圖只知道這點(diǎn)東西,想真正設(shè)計(jì)出來(lái)還是差的遠(yuǎn)呢,下面的知識(shí)將涉及到濾波器原理部分。
2、淺談FIR濾波器原理
FIR濾波器呢,就是我們所學(xué)的有限脈沖響應(yīng)濾波器。他的特點(diǎn)就是他的單位脈沖響應(yīng)是有限長(zhǎng)的。其實(shí)我們?cè)O(shè)計(jì)FIR濾波器就是設(shè)計(jì)他的單位脈沖響應(yīng),因?yàn)橐粋€(gè)信號(hào)經(jīng)過(guò)濾波器輸出,得到的輸出信號(hào)就是輸入信號(hào)與濾波器單位脈沖響應(yīng)的線性卷積,輸入信號(hào)通過(guò)與單位脈沖響應(yīng)信號(hào)之間的乘積累加運(yùn)算得到輸出信號(hào),因此我們?cè)O(shè)計(jì)各式各樣的單位脈沖響應(yīng)信號(hào),就可以根據(jù)我們的要求濾除和保留信號(hào),從而達(dá)到濾波的目的。
所謂系統(tǒng)函數(shù),即對(duì)單位脈沖響應(yīng)進(jìn)行Z變換,從Z變換的表達(dá)式我們知道,F(xiàn)IR濾波器就是單位脈沖響應(yīng)與輸入信號(hào)的乘積累加,每一個(gè)乘法器系數(shù)就是一個(gè)FIR系數(shù)。
3、關(guān)于線性相位
線性相位是FIR濾波器的一大特點(diǎn),這里的線性相位,指的是我們的濾波器具有線性相位,而前面說(shuō)了,我們的FIR濾波器,其實(shí)就是指單位脈沖響應(yīng),因此我們要設(shè)計(jì)成具有線性相位的FIR濾波器,其實(shí)就是讓我們的單位脈沖響應(yīng)滿足線性特點(diǎn)?那怎么滿足呢?因?yàn)橐粋€(gè)序列,我們對(duì)其求頻率響應(yīng)之后得到的是他的幅頻響應(yīng)與相頻響應(yīng),因此,我們需要從相頻響應(yīng)入手。即讓
即讓斜率保證是一個(gè)常數(shù)的情況下進(jìn)行討論,這個(gè)討論的過(guò)程相信大家書本上都有,因此這里就不必多講,希望大家自己好好看一下,還是那句話,只有強(qiáng)大的理論支持,你才有信息做一名合格的工程師。我這里就做一個(gè)總結(jié)吧,主要分為四種情況,即FIR濾波器的線性特性由單位脈沖響應(yīng)的長(zhǎng)度N與單位脈沖響應(yīng)的對(duì)稱情況決定:
第一類線性相位(即h(n)關(guān)于n = (N-1)/2 偶對(duì)稱) :
濾波器長(zhǎng)度N為奇數(shù)時(shí),h(n)的幅頻響應(yīng)關(guān)于w= 0,π,2π三點(diǎn)偶對(duì)稱,適合設(shè)計(jì)成各種濾波器,即低通,高通,帶通,帶阻
濾波器長(zhǎng)度N為偶數(shù)時(shí),h(n)的幅頻響應(yīng)關(guān)于w = 0,2π偶對(duì)稱,關(guān)于w = π奇對(duì)稱,不適合設(shè)計(jì)成高通和帶阻濾波器
第二類線性相位 (即h(n) 關(guān)于n = (N-1)/2 奇對(duì)稱):
濾波器長(zhǎng)度N為奇數(shù)時(shí),h(n)的幅頻響應(yīng)關(guān)于w= 0,π,2π三點(diǎn)奇對(duì)稱,只能實(shí)現(xiàn)帶通濾波器
濾波器長(zhǎng)度N為偶數(shù)時(shí),h(n)的幅頻響應(yīng)關(guān)于w = 0,2π奇對(duì)稱,關(guān)于w = π偶對(duì)稱,不適合設(shè)計(jì)成低通和帶阻濾波器
所以,要想保證FIR濾波器是線性相位,就必須得讓單位脈沖響應(yīng)是對(duì)稱的,不管是偶對(duì)稱還是奇對(duì)稱,在保證了對(duì)稱的前提下去確定濾波器長(zhǎng)度的奇偶性,從而確定合適的幅頻響應(yīng)的形狀,從而設(shè)計(jì)合適的濾波器,但是由于第一類線性相位沒(méi)有初始相位,而且當(dāng)濾波器長(zhǎng)度為奇數(shù)的情況下,我們可以設(shè)計(jì)成各種濾波器,所以第一類線性相位比較常用。
4、利用窗函數(shù)法設(shè)計(jì)FIR濾波器
窗函數(shù)設(shè)計(jì)方法是最常見,最常用,最簡(jiǎn)單的濾波器設(shè)計(jì)方法,他的基本思路是逼近的思想,為什么呢?我們先來(lái)看他的設(shè)計(jì)方法。
窗函數(shù)的設(shè)計(jì)方法,首先我們需要給出一個(gè)理想的濾波器的頻率響應(yīng),例如我們的上面的題目給出的,我要設(shè)計(jì)一個(gè)帶通濾波器,首先我需要給出一個(gè)理想的帶通濾波器的頻率響應(yīng)。
因?yàn)槭抢硐霝V波器,所以就沒(méi)有什么過(guò)渡帶所言了,所以wc1就是300HZ,wc2就是500HZ,我們將理想帶通濾波器的頻率響應(yīng)進(jìn)行逆傅里葉變換,從而得到我們理想帶通濾波器的單位脈沖響應(yīng),如果我們用這個(gè)單位脈沖響應(yīng)設(shè)計(jì)出的帶通濾波器,當(dāng)然就是最標(biāo)準(zhǔn),無(wú)誤差的濾波器了,但是現(xiàn)實(shí)與理想總是還有些差距的,將理想帶通濾波器的頻率響應(yīng)進(jìn)行逆傅里葉變換之后,我們知道,這是個(gè)無(wú)限長(zhǎng)的序列,而我們FIR濾波器是有限長(zhǎng)序列,因此我們可以利用一個(gè)窗函數(shù)和這個(gè)理想的單位脈沖響應(yīng)進(jìn)行相乘
這樣就相當(dāng)于將原來(lái)無(wú)限長(zhǎng)序列變?yōu)榱擞邢揲L(zhǎng),長(zhǎng)度就是窗函數(shù)的長(zhǎng)度,在窗內(nèi)的序列得以保留,窗外的序列就被剔除,得到一個(gè)有限長(zhǎng)單位脈沖響應(yīng)序列,也是對(duì)原來(lái)理想單位脈沖響應(yīng)的一個(gè)近似,正是由于這個(gè)近似,導(dǎo)致我們?cè)O(shè)計(jì)的濾波器與理想濾波器之間的誤差,這是由于窗函數(shù)的截?cái)嘁鸬?,稱為截?cái)嘈?yīng)。
圖中,hd(n)是理想濾波器的單位脈沖響應(yīng),w(n)是窗函數(shù)序列,二者相乘得到我們要設(shè)計(jì)的實(shí)際濾波器的單位脈沖響應(yīng),將其進(jìn)行傅里葉變換,觀察他的頻率響應(yīng),我們知道,時(shí)域相乘,就是頻域相卷,理想濾波器的頻率響應(yīng)我們之前提過(guò),窗函數(shù)的頻域函數(shù)根據(jù)不同的窗函數(shù),頻域表達(dá)式都不同,以矩形窗為例,兩者相卷得
根據(jù)這個(gè)圖我們知道,兩個(gè)函數(shù)相卷,就是兩個(gè)函數(shù)的乘積累加,也就是兩個(gè)函數(shù)圖像的左右移動(dòng)的公共面積之和。
圖b是窗函數(shù)的幅度特性函數(shù),中間那部分叫做主瓣,旁邊的小圓弧叫做旁瓣
圖c表明,將窗函數(shù)的圖像左右移動(dòng)到圖c的位置時(shí),正好窗函數(shù)的一半圖像在理想濾波器函數(shù)內(nèi),一半在外,此時(shí)對(duì)應(yīng)圖f中的過(guò)渡帶的中點(diǎn),即幅度衰減0.5那個(gè)點(diǎn)
圖d和圖e表明,當(dāng)函數(shù)移動(dòng)到這兩個(gè)位置時(shí),公共面試是最大,最小的,此時(shí)在頻域上的反應(yīng)結(jié)果就是圖f的兩個(gè)肩峰,一個(gè)正肩峰,一個(gè)負(fù)肩峰,肩峰高度為H(0)的8.95%。
從圖f中,我們可以隱隱約約看到了濾波器的影子了,雖然沒(méi)有理想濾波器那么標(biāo)準(zhǔn),但也是近似逼近了,由于我們是將理想的濾波器的單位脈沖響應(yīng)進(jìn)行截?cái)嗵幚恚虼撕瘮?shù)在左右移動(dòng)的時(shí)候會(huì)產(chǎn)生波紋,這種現(xiàn)象就叫做吉布斯效應(yīng)。
5、關(guān)于吉布斯效應(yīng)
為了更好的逼近理想濾波器,我們需要讓他的過(guò)渡帶更窄,阻帶下降更快,波紋越小,阻帶衰減越大。我們從課本上知道,主瓣寬度是由窗函數(shù)的長(zhǎng)度決定的,以矩形窗為例,他的主瓣寬度為4π/N,主瓣寬度就是濾波器的過(guò)渡帶帶寬,為了減小過(guò)渡帶帶寬,是不是可以通過(guò)增大N值來(lái)解決吉布斯效應(yīng)呢?增大N值僅僅可以減小過(guò)渡帶,但是不能很好的減小波紋幅度,要想更好地逼近理想濾波器,還要從窗函數(shù)的形狀上下手
6、常用窗函數(shù)
我們可以看到,不同的窗函數(shù)的幅頻特性還是區(qū)別很大的,一般情況下,旁瓣幅度越小,濾波器的波紋越小,旁瓣幅度下降越大,濾波器阻帶衰減越快,主瓣寬度越小,那么濾波器的過(guò)渡帶就越窄,然而魚和熊掌不能兼得,從上圖我們看到,要得到幅度小的旁瓣,是要犧牲主瓣寬度為代價(jià)的,而主瓣寬度小的,往往旁瓣幅度大,例如矩形窗。
這些東西大部分都是我們課本上的了,就不必多說(shuō),我們接下來(lái)看工程應(yīng)用部分。
7、FIR濾波器的matlab設(shè)計(jì)
其實(shí)matlab已經(jīng)給我們提供了強(qiáng)大的函數(shù)工具箱,我們只需要給定參數(shù)就可以設(shè)計(jì)出符合我們要求的濾波器,但是對(duì)于理論知識(shí),我們還是要知道的,即使我們用不上那些復(fù)雜的推導(dǎo)過(guò)程,但是至少我們知道他是怎么來(lái)的,對(duì)我們的設(shè)計(jì)也有一定的知道意義。
上面那個(gè)題目我要求大家用kaiserord函數(shù)來(lái)獲得濾波器參數(shù),先來(lái)講一下這個(gè)函數(shù)
kaiserord 函數(shù)的語(yǔ)法:
[n,wn,beta,filtype] = kaiserord [f,a,dev,fs] ;
即將濾波器的過(guò)渡帶參數(shù)f,幅度參數(shù),通帶阻帶誤差,采樣頻率送給kaiserird函數(shù),將會(huì)返回我們需要的濾波器參數(shù),包括濾波器階數(shù),截止頻率,凱塞窗參數(shù)beta以及濾波器類型。
例如,根據(jù)題目要求,過(guò)渡帶帶寬分別為100~300HZ,500~700HZ,阻帶允許誤差為0.02,通帶允許誤差為0.01,采樣頻率為2000HZ 的帶通濾波器
解釋一下a是怎么設(shè)置的,參數(shù)a是一個(gè)向量,第一個(gè)參數(shù)表示0~fc(1)頻段的幅度情況,第二個(gè)參數(shù)表示fc(2)~fc(3)頻段內(nèi)的幅度特性,以此類推,例如我們要設(shè)計(jì)帶通濾波器,設(shè)置a = [0 1 0],就是指在頻段300~500hz內(nèi)是通帶,其他為阻帶。
函數(shù)返回的值為最小的濾波器階數(shù),并不是濾波器長(zhǎng)度,濾波器長(zhǎng)度 N = n+1;
題目還要求設(shè)計(jì)成等波紋最優(yōu)濾波器,即等波紋切比雪夫?yàn)V波器,至于最優(yōu)濾波器的推導(dǎo)過(guò)程十分復(fù)雜,大家可以自己去看書,這里只是調(diào)用matlab自己的函數(shù)庫(kù),從而為我們節(jié)省了大量的時(shí)間,設(shè)計(jì)最優(yōu)濾波器的函數(shù)是cfirpm
函數(shù)語(yǔ)法為:
fir_pm = cfirpm (n,fpm,mag);
n為濾波器階數(shù),fpm跟上面的f類似,也是各個(gè)頻帶的參數(shù),mag是各個(gè)頻帶的幅度參數(shù),但是略有不同,例如我們要設(shè)計(jì)的帶通濾波器:
要注意的是,參數(shù)mag必須是與fpm等長(zhǎng)的向量,具體含義大體為,第一個(gè)參數(shù)為起始幅值,第二個(gè)參數(shù)是0~fpm(1)頻帶的參數(shù),第三個(gè)參數(shù)是fpm(1)~fpm(2)頻帶的參數(shù),以此類推。例如我們?cè)O(shè)計(jì)的帶通濾波器,就是mag = [0 0 1 1 0 0 ],即表示在300~500HZ頻帶內(nèi)為通帶,其余為阻帶。
至于歸一化處理,就是相當(dāng)于將所有頻率放到一個(gè)合適的坐標(biāo)系里來(lái)觀察,并不影響濾波器性能。
通過(guò)這個(gè)函數(shù),我們就相當(dāng)于設(shè)計(jì)出了一個(gè)濾波器,函數(shù)返回值fir_pm就是濾波器系數(shù),也就是單位脈沖響應(yīng),我們要做的就是講這些系數(shù)送入FPGA,只要有了濾波器系數(shù),剩下的就只剩下乘積累加了,但是這些系數(shù)不利于FPGA計(jì)算,F(xiàn)PGA適合的是二進(jìn)制的運(yùn)算方式,因此我們需要將這些系數(shù)進(jìn)行量化,前面提到了,量化位數(shù)為12bit
至于語(yǔ)法為什么是這樣,基礎(chǔ)不好的朋友可以自行去補(bǔ)課,也可以聯(lián)系本人,簡(jiǎn)單說(shuō)一下,因?yàn)槲覀冞@里的計(jì)算全部是有符號(hào)數(shù)的形式,因此需要將數(shù)轉(zhuǎn)化成16進(jìn)制補(bǔ)碼的形式,保證在通過(guò)FPGA進(jìn)行運(yùn)算的時(shí)候的符號(hào)是正確的。
當(dāng)然我們還要觀察這個(gè)濾波器設(shè)計(jì)的情況,就要看他的幅頻響應(yīng),通過(guò)繪圖來(lái)觀察
源程序中我分別用凱塞窗和最優(yōu)濾波器來(lái)設(shè)計(jì)了這個(gè)帶通濾波器,大家可以比較一下兩種方法的區(qū)別,最終設(shè)計(jì)好的濾波器幅頻響應(yīng)圖
我們可以看到,最優(yōu)濾波器的旁瓣是等波紋的,而凱塞窗在旁瓣幅度方面跟最優(yōu)濾波器還是略第一個(gè)檔次,要不然人家為什么要叫最優(yōu)濾波器呢
8、信號(hào)產(chǎn)生
根據(jù)題目要求,我們需要產(chǎn)生一個(gè)由三個(gè)頻率疊加而成的信號(hào),讓這個(gè)信號(hào)通過(guò)濾波器進(jìn)行濾波。對(duì)于信號(hào)的產(chǎn)生過(guò)程這里沒(méi)必要多少,大家自己去寫,我們可以先通過(guò)matlab來(lái)仿真一下,這個(gè)信號(hào)經(jīng)過(guò)濾波器濾波后是什么樣子的。
可以看到,三個(gè)信號(hào)疊加而成的合成信號(hào)的頻段分為三個(gè)部分,即100,400,800HZ,分別對(duì)應(yīng)三個(gè)信號(hào),這是在頻域觀察到的,由于在時(shí)域他們是相互重疊的,因此不好濾除,但是到了頻域,他們確是分開的,因此可以通過(guò)濾波器濾除。我們的濾波器僅僅允許400HZ的信號(hào)通過(guò),因此經(jīng)過(guò)濾波器濾波后,紅色線只剩下頻段為 400HZ的頻段了,我們將經(jīng)濾波器濾除后的時(shí)域信號(hào)顯示一下
可以看到,經(jīng)濾波器濾波后,頻率為400hz的信號(hào)被保留,時(shí)域信號(hào)是完整的正弦波,有些朋友可能會(huì)說(shuō),怎么會(huì)有失真呢?失真可能是有點(diǎn),但是還是由于我們的采樣頻率不夠高,都是還原的波形不夠圓滑。還有人可能會(huì)說(shuō),根據(jù)時(shí)域采樣定理,不是采樣頻率大于2倍的信號(hào)頻率就可以被還原成原始信號(hào)嗎?但是我們這里并不是還原原始信號(hào),這還是數(shù)字信號(hào),只是將濾波后離散的點(diǎn)用線連起來(lái)了而已。
9、FIR濾波器的FPGA實(shí)現(xiàn)
好了,matlab仿真成功,剩下的就需要在FPGA上實(shí)現(xiàn)了,在FPGA上實(shí)現(xiàn)什么呢?前面我們已經(jīng)得到了濾波器的系數(shù),只要有了濾波器系數(shù),剩下的不就是乘積累加了么,所以,我們需要在FPGA上實(shí)現(xiàn)信號(hào)的乘積累加,即對(duì)疊加信號(hào)和濾波器系數(shù)的乘積累加。 濾波器系數(shù)已經(jīng)有了,那么信號(hào)在哪呢?我們可以利用matlab將生成的疊加信號(hào)以2進(jìn)制的形式寫到一個(gè)文件中去,注意是12bit量化。那也就是說(shuō),每一個(gè)數(shù)據(jù)是由12位二進(jìn)制組成的,根據(jù)采樣頻率,共有2000個(gè)數(shù)據(jù),這2000個(gè)數(shù)據(jù),全部用二進(jìn)制補(bǔ)碼表示,共同組成了一個(gè)疊加信號(hào),至于怎么將數(shù)據(jù)寫到文件中去,這里不解釋,大家可以自己下載代碼,自己學(xué)習(xí)
有了濾波器系數(shù),有了輸入信號(hào),下面就可以設(shè)計(jì)硬件電路了,根據(jù)線性卷積的原理,需要將輸入信號(hào)和濾波器系數(shù)進(jìn)行乘積累加,由于我們的濾波器是線性相位的,即關(guān)于(N-1)/2 偶對(duì)稱,這里我們?cè)O(shè)計(jì)的濾波器階數(shù)為23,這個(gè)參數(shù)是由kaiserord函數(shù)返回來(lái)得到的,也就是說(shuō)濾波器長(zhǎng)度是24,而且又是偶對(duì)稱的,所以只需要將輸入信號(hào)的對(duì)稱位數(shù)與濾波器系數(shù)的前半部分相乘即可,即只需乘到h(11)即可,因?yàn)楹竺娴亩际歉懊娴闹貜?fù)的。
data_a <= { shift_reg [0] [11] , shift_reg [0] } ;
data_b <= { shift_reg [23] [11], shift_reg [23] };
hn <= 12'hfec; //hn(0)
注意,這里定義了24個(gè)位寬為12的移位寄存器,即每隔一段時(shí)間輸入一個(gè)位寬為12bit的數(shù),這個(gè)時(shí)間就是一個(gè)數(shù)據(jù)周期,在數(shù)據(jù)周期內(nèi)要完成一個(gè)數(shù)的線性卷積運(yùn)算,由于我們的濾波器長(zhǎng)度是24,這里定義寄存器長(zhǎng)度也為24。
data_a 是累加器的加數(shù)a,將輸入的第一個(gè)數(shù)據(jù)與他的最高位位,即符號(hào)位拼接來(lái)擴(kuò)展為13位的數(shù)據(jù),因?yàn)閮蓚€(gè)12位的數(shù)相加,為了保證符號(hào)位不溢出,需要13位的位寬,而要得到13位的輸出結(jié)果,因?yàn)槲覀兪钦{(diào)用加法器IP核的,所以輸入的數(shù)據(jù)位寬也要是13位位寬。
data_b是移位寄存器的最高位內(nèi)的數(shù)據(jù),將移位寄存器的最高位與最低位相加,在跟濾波器系數(shù)相乘,同理將次低位與次高位相乘,等到一個(gè)數(shù)據(jù)的12位全部與濾波器系數(shù)相乘完畢之后,將數(shù)據(jù)輸出,一個(gè)數(shù)據(jù)的濾波完成,接著送來(lái)下一個(gè)12位的數(shù)據(jù),繼續(xù)進(jìn)行卷積運(yùn)算,一直等到所有數(shù)據(jù)(2000個(gè)點(diǎn))濾波完成。
hn是由matlab生成的濾波器系數(shù),共有24個(gè),全部是經(jīng)過(guò)12bit量化后的由16進(jìn)制數(shù)表示的,我們直接調(diào)用就行,由于他的對(duì)稱性,我們只需要調(diào)用前12個(gè)即可,后12個(gè)參數(shù)跟前12個(gè)參數(shù)是對(duì)稱的
上面這個(gè)過(guò)程需要進(jìn)行11次,因?yàn)槊看螌蓚€(gè)數(shù)進(jìn)行乘積,等到11次累乘結(jié)束,就要將這11累乘的結(jié)果累加并輸出,得到一個(gè)點(diǎn)的濾波結(jié)果
注意:這里我等到cnt = 1的時(shí)候才進(jìn)行累加輸出,為什么呢?由于我們的乘法器和加法器需要時(shí)間進(jìn)行運(yùn)算,當(dāng)cnt = 11的時(shí)候理論上所有數(shù)據(jù)運(yùn)算完畢,但是我們還是要通過(guò)行為仿真,看一下最后一次累加什么時(shí)候結(jié)束,等最后一次累加結(jié)束后,我們?cè)賹?shù)據(jù)輸出,并將累加器清零
乘法器的兩個(gè)參數(shù),一個(gè)是前面加法器的和,另一個(gè)是濾波器系數(shù)hn,加法器輸出是13位位寬,濾波器系數(shù)是12位位寬,因此乘法器輸出為25位位寬,由于是將23個(gè)乘法器輸出的結(jié)果進(jìn)行累加,因此,為了保證數(shù)據(jù)不溢出,要設(shè)置一個(gè)比較保險(xiǎn)的位寬來(lái)存取這個(gè)累加結(jié)果,這里我們選用30位位寬
11、testbench的書寫
這里僅簡(jiǎn)單介紹一點(diǎn),關(guān)于testbench的書寫主要涉及兩方面,一個(gè)是將信號(hào)讀出來(lái)送入FPGA仿真,一方面是將經(jīng)FPGA濾波后的數(shù)據(jù)輸出,再供matlab調(diào)用仿真
將數(shù)據(jù)輸出到文件**matlab調(diào)用
always @(posedge data_clk) begin
if(rst_n == 1)
$fdisplay(fir_dataout_file,'%d',fir_dataout);
end
好了,一切準(zhǔn)備就緒,我們通過(guò)modelsim來(lái)仿真我們的濾波器,看信號(hào)濾波前和濾波后的差距
可以看到,濾波前的信號(hào)雜亂無(wú)章,是因?yàn)樗怯腥齻€(gè)頻率的信號(hào)疊加而成,而經(jīng)過(guò)濾波器濾波后的信號(hào)變得井井有條,此時(shí)modelsim已經(jīng)將FPGA輸出的數(shù)據(jù)以txt文件的格式保存起來(lái),如果我們用matlab將這些數(shù)據(jù)讀回,做一下時(shí)域和頻域信號(hào)的分析,就可以驗(yàn)證我們?yōu)V波器設(shè)計(jì)的正確性
執(zhí)行上面的代碼得到濾波后的信號(hào)的頻域波形與時(shí)域波形
根據(jù)這個(gè)波形我們可以看到,經(jīng)過(guò)FPGA設(shè)計(jì)的FIR濾波器濾波后的信號(hào)時(shí)域波形,跟我們之前用matlab仿真時(shí)的時(shí)域波形相同,頻域波形可以很明顯的看到,只有頻率為400hz的信號(hào)被保留下來(lái),100hz與800hz的信號(hào)已被濾除,從matlab仿真結(jié)果來(lái)看,我們?cè)O(shè)計(jì)的濾波器還是符合要求的。
好了,我們反過(guò)頭來(lái)再來(lái)看一下之前的題目
利用matlab設(shè)計(jì)一個(gè)線性相位FIR帶通濾波器,并在FPGA上實(shí)現(xiàn)。要求:
1、濾波器指標(biāo):過(guò)渡帶帶寬分別為100~300HZ,500~700HZ,阻帶允許誤差為0.02,通帶允許誤差為0.01,采樣頻率為2000HZ,量化位數(shù)為12bit
2、設(shè)計(jì)方法,要求利用kaiserord函數(shù)獲取濾波器參數(shù),并設(shè)計(jì)成等波紋最優(yōu)濾波器
3、要求對(duì)疊加信號(hào)進(jìn)行濾波,疊加信號(hào)是由頻率分別為100 ,400,800HZ的正弦波疊加而成,要求將信號(hào)通過(guò)FPGA濾波后的用modelsim仿真,并在matlab中驗(yàn)證濾波器的正確性
是不是覺得好像也并不是很難,我們的設(shè)計(jì)要求也都基本達(dá)到了,但是好像也并不是很簡(jiǎn)單,這里面設(shè)計(jì)了大量的專業(yè)知識(shí),很多東西我都是一筆帶過(guò),肯定還有很多朋友是看不懂的,所以,現(xiàn)在知道理論的重要性了吧。
今天講的只是個(gè)帶通濾波器的設(shè)計(jì)過(guò)程,大家可以自己進(jìn)行變通,自己想題目或者去網(wǎng)上找題目,相信很快大家就會(huì)熟悉濾波器的設(shè)計(jì)過(guò)程,當(dāng)然當(dāng)我們?cè)O(shè)計(jì)FIR濾波器的時(shí)候,一般使用的IP核來(lái)設(shè)計(jì),不用像這樣設(shè)計(jì),然而有些器件并沒(méi)有提供FIR的IP核,因此掌握好自己設(shè)計(jì)的技巧還是很有必要的,例如下次我們要講的IIR濾波器,我的芯片就不提供IIR的IP,所以~
這篇文章就算是開個(gè)頭,下一篇主要講IIR濾波器,這估計(jì)得到7月份了,要考試了,我也得去復(fù)習(xí)了,所以今天就先到這里,謝謝大家支持~
|