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