設(shè)計(jì)要求
利用matlab設(shè)計(jì)一個(gè)線性相位FIR帶通濾波器,并在FPGA上實(shí)現(xiàn)。
1、濾波器指標(biāo):過渡帶帶寬分別為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)通過FPGA濾波后的用modelsim仿真,并在matlab中驗(yàn)證濾波器的正確性
很多朋友一看,這是嘛呀?即使當(dāng)時(shí)數(shù)字信號(hào)處理學(xué)的還算可以,但是真正到工程中就傻了眼了,好吧,半個(gè)月前我也是這種狀態(tài),下面我就記錄一下這段時(shí)間學(xué)這部分知識(shí)的過程吧
1、嘛叫濾波器?
我們所說的當(dāng)然就是數(shù)字濾波器了,官方解釋就是輸入輸出都是數(shù)字信號(hào),通過數(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)的過程。但是對(duì)于信號(hào)的頻帶相互疊加的情況,經(jīng)典濾波器就無能為力了,就需要用到現(xiàn)代濾波器,當(dāng)然也就更高大上了,我水平有限,也不知道他是嘛了~
而我們常用的濾波器就是選頻濾波器了,就像上面那個(gè)我給大家出的題目就是一個(gè)選頻濾波器。學(xué)過數(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)過濾波器濾波后頻率成分幅度的衰減情況,相頻響應(yīng)表示的是信號(hào)經(jīng)濾波器濾波后的延時(shí)情況,因此我們往往通過這兩個(gè)特性來觀察我們的濾波器是否符合我們的設(shè)計(jì)要求。
下面先看一個(gè)帶通濾波器的設(shè)計(jì)指標(biāo)圖
經(jīng)典濾波器的指標(biāo)主要就分為4個(gè),即通帶截止頻率,阻帶截止頻率,通帶最大衰減,阻帶最小衰減。關(guān)于這4個(gè)參數(shù)的意思想必大家都已經(jīng)很熟了,要不然信號(hào)處理這門課**的是白學(xué)了,這里就不再多說,我們直接看之前的題目,題目要求我們的過渡帶頻率分別為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)通過濾波器之后,應(yīng)該是阻帶內(nèi)的信號(hào)濾除,只保留通帶內(nèi)的信號(hào)才對(duì),所以最后我們要驗(yàn)證的就是,通過濾波器濾波后的信號(hào)的波形,要跟信號(hào)頻率為400HZ的信號(hào)波形一致,才證明我們的濾波器設(shè)計(jì)正確。好了,好像我們根據(jù)這個(gè)圖只知道這點(diǎn)東西,想真正設(shè)計(jì)出來還是差的遠(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)過濾波器輸出,得到的輸出信號(hào)就是輸入信號(hào)與濾波器單位脈沖響應(yīng)的線性卷積,輸入信號(hào)通過與單位脈沖響應(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),這里的線性相位,指的是我們的濾波器具有線性相位,而前面說了,我們的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è)討論的過程相信大家書本上都有,因此這里就不必多講,希望大家自己好好看一下,還是那句話,只有強(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ì)合適的濾波器,但是由于第一類線性相位沒有初始相位,而且當(dāng)濾波器長(zhǎng)度為奇數(shù)的情況下,我們可以設(shè)計(jì)成各種濾波器,所以第一類線性相位比較常用。
4、利用窗函數(shù)法設(shè)計(jì)FIR濾波器
窗函數(shù)設(shè)計(jì)方法是最常見,最常用,最簡(jiǎn)單的濾波器設(shè)計(jì)方法,他的基本思路是逼近的思想,為什么呢?我們先來看他的設(shè)計(jì)方法。
窗函數(shù)的設(shè)計(jì)方法,首先我們需要給出一個(gè)理想的濾波器的頻率響應(yīng),例如我們的上面的題目給出的,我要設(shè)計(jì)一個(gè)帶通濾波器,首先我需要給出一個(gè)理想的帶通濾波器的頻率響應(yīng)。
因?yàn)槭抢硐霝V波器,所以就沒有什么過渡帶所言了,所以wc1就是300HZ,wc2就是500HZ,我們將理想帶通濾波器的頻率響應(yīng)進(jìn)行逆傅里葉變換,從而得到我們理想帶通濾波器的單位脈沖響應(yīng),如果我們用這個(gè)單位脈沖響應(yīng)設(shè)計(jì)出的帶通濾波器,當(dāng)然就是最標(biāo)準(zhǔn),無誤差的濾波器了,但是現(xiàn)實(shí)與理想總是還有些差距的,將理想帶通濾波器的頻率響應(yīng)進(jìn)行逆傅里葉變換之后,我們知道,這是個(gè)無限長(zhǎng)的序列,而我們FIR濾波器是有限長(zhǎng)序列,因此我們可以利用一個(gè)窗函數(shù)和這個(gè)理想的單位脈沖響應(yīng)進(jìn)行相乘
這樣就相當(dāng)于將原來無限長(zhǎng)序列變?yōu)榱擞邢揲L(zhǎng),長(zhǎng)度就是窗函數(shù)的長(zhǎng)度,在窗內(nèi)的序列得以保留,窗外的序列就被剔除,得到一個(gè)有限長(zhǎng)單位脈沖響應(yīng)序列,也是對(duì)原來理想單位脈沖響應(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)我們之前提過,窗函數(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中的過渡帶的中點(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中,我們可以隱隱約約看到了濾波器的影子了,雖然沒有理想濾波器那么標(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)
為了更好的逼近理想濾波器,我們需要讓他的過渡帶更窄,阻帶下降更快,波紋越小,阻帶衰減越大。我們從課本上知道,主瓣寬度是由窗函數(shù)的長(zhǎng)度決定的,以矩形窗為例,他的主瓣寬度為4π/N,主瓣寬度就是濾波器的過渡帶帶寬,為了減小過渡帶帶寬,是不是可以通過增大N值來解決吉布斯效應(yīng)呢?增大N值僅僅可以減小過渡帶,但是不能很好的減小波紋幅度,要想更好地逼近理想濾波器,還要從窗函數(shù)的形狀上下手
6、常用窗函數(shù)
我們可以看到,不同的窗函數(shù)的幅頻特性還是區(qū)別很大的,一般情況下,旁瓣幅度越小,濾波器的波紋越小,旁瓣幅度下降越大,濾波器阻帶衰減越快,主瓣寬度越小,那么濾波器的過渡帶就越窄,然而魚和熊掌不能兼得,從上圖我們看到,要得到幅度小的旁瓣,是要犧牲主瓣寬度為代價(jià)的,而主瓣寬度小的,往往旁瓣幅度大,例如矩形窗。
這些東西大部分都是我們課本上的了,就不必多說,我們接下來看工程應(yīng)用部分。
7、FIR濾波器的matlab設(shè)計(jì)
其實(shí)matlab已經(jīng)給我們提供了強(qiáng)大的函數(shù)工具箱,我們只需要給定參數(shù)就可以設(shè)計(jì)出符合我們要求的濾波器,但是對(duì)于理論知識(shí),我們還是要知道的,即使我們用不上那些復(fù)雜的推導(dǎo)過程,但是至少我們知道他是怎么來的,對(duì)我們的設(shè)計(jì)也有一定的知道意義。
上面那個(gè)題目我要求大家用kaiserord函數(shù)來獲得濾波器參數(shù),先來講一下這個(gè)函數(shù)
kaiserord 函數(shù)的語(yǔ)法:
[n,wn,beta,filtype] = kaiserord [f,a,dev,fs] ;
即將濾波器的過渡帶參數(shù)f,幅度參數(shù),通帶阻帶誤差,采樣頻率送給kaiserird函數(shù),將會(huì)返回我們需要的濾波器參數(shù),包括濾波器階數(shù),截止頻率,凱塞窗參數(shù)beta以及濾波器類型。
例如,根據(jù)題目要求,過渡帶帶寬分別為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)過程十分復(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)系里來觀察,并不影響濾波器性能。
通過這個(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)單說一下,因?yàn)槲覀冞@里的計(jì)算全部是有符號(hào)數(shù)的形式,因此需要將數(shù)轉(zhuǎn)化成16進(jìn)制補(bǔ)碼的形式,保證在通過FPGA進(jìn)行運(yùn)算的時(shí)候的符號(hào)是正確的。
當(dāng)然我們還要觀察這個(gè)濾波器設(shè)計(jì)的情況,就要看他的幅頻響應(yīng),通過繪圖來觀察
源程序中我分別用凱塞窗和最優(yōu)濾波器來設(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)通過濾波器進(jìn)行濾波。對(duì)于信號(hào)的產(chǎn)生過程這里沒必要多少,大家自己去寫,我們可以先通過matlab來仿真一下,這個(gè)信號(hào)經(jīng)過濾波器濾波后是什么樣子的。
可以看到,三個(gè)信號(hào)疊加而成的合成信號(hào)的頻段分為三個(gè)部分,即100,400,800HZ,分別對(duì)應(yīng)三個(gè)信號(hào),這是在頻域觀察到的,由于在時(shí)域他們是相互重疊的,因此不好濾除,但是到了頻域,他們確是分開的,因此可以通過濾波器濾除。我們的濾波器僅僅允許400HZ的信號(hào)通過,因此經(jīng)過濾波器濾波后,紅色線只剩下頻段為 400HZ的頻段了,我們將經(jīng)濾波器濾除后的時(shí)域信號(hào)顯示一下
可以看到,經(jīng)濾波器濾波后,頻率為400hz的信號(hào)被保留,時(shí)域信號(hào)是完整的正弦波,有些朋友可能會(huì)說,怎么會(huì)有失真呢?失真可能是有點(diǎn),但是還是由于我們的采樣頻率不夠高,都是還原的波形不夠圓滑。還有人可能會(huì)說,根據(jù)時(shí)域采樣定理,不是采樣頻率大于2倍的信號(hào)頻率就可以被還原成原始信號(hào)嗎?但是我們這里并不是還原原始信號(hào),這還是數(shù)字信號(hào),只是將濾波后離散的點(diǎn)用線連起來了而已。
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量化。那也就是說,每一個(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ù)返回來得到的,也就是說濾波器長(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)位拼接來擴(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ù)的濾波完成,接著送來下一個(gè)12位的數(shù)據(jù),繼續(xù)進(jìn)行卷積運(yùn)算,一直等到所有數(shù)據(jù)(2000個(gè)點(diǎn))濾波完成。
hn是由matlab生成的濾波器系數(shù),共有24個(gè),全部是經(jīng)過12bit量化后的由16進(jìn)制數(shù)表示的,我們直接調(diào)用就行,由于他的對(duì)稱性,我們只需要調(diào)用前12個(gè)即可,后12個(gè)參數(shù)跟前12個(gè)參數(shù)是對(duì)稱的
上面這個(gè)過程需要進(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)算完畢,但是我們還是要通過行為仿真,看一下最后一次累加什么時(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)的位寬來存取這個(gè)累加結(jié)果,這里我們選用30位位寬
10、testbench的書寫
這里僅簡(jiǎn)單介紹一點(diǎn),關(guān)于testbench的書寫主要涉及兩方面,一個(gè)是將信號(hào)讀出來送入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)備就緒,我們通過modelsim來仿真我們的濾波器,看信號(hào)濾波前和濾波后的差距
可以看到,濾波前的信號(hào)雜亂無章,是因?yàn)樗怯腥齻€(gè)頻率的信號(hào)疊加而成,而經(jīng)過濾波器濾波后的信號(hào)變得井井有條,此時(shí)modelsim已經(jīng)將FPGA輸出的數(shù)據(jù)以txt文件的格式保存起來,如果我們用matlab將這些數(shù)據(jù)讀回,做一下時(shí)域和頻域信號(hào)的分析,就可以驗(yàn)證我們?yōu)V波器設(shè)計(jì)的正確性
執(zhí)行上面的代碼得到濾波后的信號(hào)的頻域波形與時(shí)域波形
根據(jù)這個(gè)波形我們可以看到,經(jīng)過FPGA設(shè)計(jì)的FIR濾波器濾波后的信號(hào)時(shí)域波形,跟我們之前用matlab仿真時(shí)的時(shí)域波形相同,頻域波形可以很明顯的看到,只有頻率為400hz的信號(hào)被保留下來,100hz與800hz的信號(hào)已被濾除,從matlab仿真結(jié)果來看,我們?cè)O(shè)計(jì)的濾波器還是符合要求的。
編輯:lyn
-
FPGA
+關(guān)注
關(guān)注
1631文章
21807瀏覽量
606777 -
濾波器
+關(guān)注
關(guān)注
161文章
7888瀏覽量
179171 -
數(shù)字信號(hào)
+關(guān)注
關(guān)注
2文章
982瀏覽量
47696
原文標(biāo)題:零基礎(chǔ)學(xué)FPGA (二十九)濾波器開篇,線性相位FIR濾波器的FPGA實(shí)現(xiàn)
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于FPGA實(shí)現(xiàn)FIR數(shù)字濾波器
![基于<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>FIR</b>數(shù)字<b class='flag-5'>濾波器</b>](https://file1.elecfans.com/web2/M00/0B/C9/wKgaomcp1z2ANDBJAAAG52-NZzg463.jpg)
帶通濾波器的插損與哪些因素有關(guān)
FIR濾波器的工作原理和特點(diǎn)
![<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>的工作原理和特點(diǎn)](https://file1.elecfans.com/web2/M00/00/A0/wKgZomawjdqALkv8AAEBVvCt4bw906.png)
如何區(qū)分IIR濾波器和FIR濾波器
iir濾波器和fir濾波器的優(yōu)勢(shì)和特點(diǎn)
基于 FPGA 的任意波形發(fā)生器+低通濾波器系統(tǒng)設(shè)計(jì)
基于matlab FPGA verilog的FIR濾波器設(shè)計(jì)
matlab與FPGA數(shù)字信號(hào)處理系列 Verilog 實(shí)現(xiàn)并行 FIR 濾波器
DSP教學(xué)實(shí)驗(yàn)箱_DSP算法實(shí)驗(yàn)_嵌入式教程:4-3 有限沖激響應(yīng)濾波器(FIR)算法(CCS顯示)
Matlab生成fir濾波器抽頭系數(shù)
Vivado 使用Simulink設(shè)計(jì)FIR濾波器
高通濾波器、低通濾波器、帶通濾波器怎樣測(cè)幅頻特性?
Matlab生成fir濾波器抽頭系數(shù)的流程
![<b class='flag-5'>Matlab</b>生成<b class='flag-5'>fir</b><b class='flag-5'>濾波器</b>抽頭系數(shù)的流程](https://file1.elecfans.com/web2/M00/C6/84/wKgaomYA2HKASx4sAAAF2JXacP0277.png)
Vivado經(jīng)典案例:使用Simulink設(shè)計(jì)FIR濾波器
![Vivado經(jīng)典案例:使用Simulink設(shè)計(jì)<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>](https://file1.elecfans.com/web2/M00/C6/82/wKgaomYA0T-AcDvvAAAZ77SrOs8816.jpg)
如何在Matlab中實(shí)現(xiàn)不同窗低通濾波器的設(shè)計(jì)?
![如何在<b class='flag-5'>Matlab</b>中<b class='flag-5'>實(shí)現(xiàn)</b>不同窗低通<b class='flag-5'>濾波器</b>的設(shè)計(jì)?](https://file1.elecfans.com/web2/M00/C2/3F/wKgaomXdfcWAcFJ0AAA5_M55h8M481.png)
評(píng)論