<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 汽車電子 > 設(shè)計(jì)應(yīng)用 > 基于FPGA的分布式算法FIR濾波器設(shè)計(jì)

          基于FPGA的分布式算法FIR濾波器設(shè)計(jì)

          ——
          作者: 時(shí)間:2007-10-29 來(lái)源:電子測(cè)量技術(shù) 收藏

            引 言

            (finite impulse response)是數(shù)字信號(hào)處理系統(tǒng)中最基本的元件,它可以在保證任意幅頻特性的同時(shí)具有嚴(yán)格的線性相頻特性,同時(shí)其單位沖激響應(yīng)是有限的,沒(méi)有輸入到輸出的反饋,是穩(wěn)定的系統(tǒng)。因此,在通信、圖像處理、模式識(shí)別等領(lǐng)域都有著廣泛的應(yīng)用。

            目前的硬件實(shí)現(xiàn)有以下幾種方式:

            一種是使用單片通用數(shù)字濾波器集成電路,這種電路使用簡(jiǎn)單,但是由于字長(zhǎng)和階數(shù)的規(guī)格較少,不易完全滿足實(shí)際需要。雖然可采用多片擴(kuò)展來(lái)滿足要求,但會(huì)增加體積和功耗,因而在實(shí)際應(yīng)用中受到限制。

            另一種是使用DSP芯片。DSP芯片有專用的數(shù)字信號(hào)處理函數(shù)可調(diào)用,實(shí)現(xiàn)FIR濾波器相對(duì)簡(jiǎn)單,但是由于程序順序執(zhí)行,速度受到限制。而且,就是同一公司的不同系統(tǒng)的DSP芯片,其編程指令也會(huì)有所不同,開發(fā)周期較長(zhǎng)。

            還有一種是使用可編程邏輯器件,/CPLD。有著規(guī)整的內(nèi)部邏輯塊整列和豐富的連線資源,特別適合用于細(xì)粒度和高并行度結(jié)構(gòu)的FIR濾波器的實(shí)現(xiàn),相對(duì)于串行運(yùn)算主導(dǎo)的通用DSP芯片來(lái)說(shuō),并行性和可擴(kuò)展性都更好。

            FIR濾波器的主要組成模塊是乘累加單元(MAC),如果按照直觀結(jié)構(gòu)構(gòu)造乘法器和系數(shù)寄存器來(lái)實(shí)現(xiàn)會(huì)占用大量的邏輯資源,顯然不可取。本文采用基于分布式算法思想的方法來(lái)設(shè)計(jì)FIR濾波器,并在上實(shí)現(xiàn)。

            1 分布式算法原理

            分布式算法(distributed arithmetic,DA)最初是在1973年由Croisier提出的,但直到Xilinx發(fā)明FPGA的查找表以后,DA算法才在上世紀(jì)90年代初重新受到重視,并有效地應(yīng)用在FIR濾波器的設(shè)計(jì)中。DA算法的原理如下。

            一線性時(shí)不變網(wǎng)絡(luò)的輸出為:

            

            假設(shè)c(n)為已知常系數(shù),x(n)是變量,用(B+1)位2進(jìn)制補(bǔ)碼表示為:

            

            函數(shù)f(c(n),xb(n))的實(shí)現(xiàn)方法是利用一個(gè)LUT(查找表)實(shí)現(xiàn)影射f(c(n),xb(n)),也就是說(shuō)2N字寬、預(yù)先設(shè)定程序的LUT接收一個(gè)N位輸入向量xb=[xb[0],xb[1]…xb[N-1]],輸出為f(c(n),xb(n)),個(gè)個(gè)影射,f(c(n),xb(n))都由相應(yīng)的二次冪加權(quán)并累加。對(duì)于固定系數(shù),整數(shù)乘以2b即左移6位,可以通過(guò)硬連線實(shí)現(xiàn),不占用邏輯資源,利用圖1所示的移位加法器就能有效地實(shí)現(xiàn)累加。DA算法的主要特點(diǎn)是巧妙利用SRAM查找表將固定系數(shù)的MAC運(yùn)算轉(zhuǎn)化為查表操作,其運(yùn)算速度不隨系數(shù)和輸入數(shù)據(jù)精度的增加而降低,而且相對(duì)直接實(shí)現(xiàn)乘法器和系數(shù)寄存器在邏輯資源占用上得到了極大的改善。缺點(diǎn)是查找表的大小隨濾波器的階數(shù)的增加呈指數(shù)增長(zhǎng),這時(shí)可以采用將大查找表分解為小查找表的方法來(lái)降低邏輯資源的消耗,如圖2所示。

            

            2 FIR濾波器的網(wǎng)絡(luò)結(jié)構(gòu)

            N階FIR濾波器相對(duì)于輸入時(shí)間序列x(n)的輸出表達(dá)式為:

            

            即輸出序列為單位脈沖相應(yīng)h(n)與輸入x(n)的卷積,由卷積關(guān)系可直接畫出結(jié)構(gòu)圖,稱之為直接型結(jié)構(gòu),如圖3所示,該結(jié)構(gòu)中共需要N個(gè)乘法器。

            

            對(duì)于線性相位FIR濾波器,其單位取樣響應(yīng)是對(duì)稱或反對(duì)稱的,即:

            

            利用對(duì)稱性可以簡(jiǎn)化網(wǎng)絡(luò)結(jié)構(gòu),當(dāng)h(n)為偶對(duì)稱且N為偶數(shù)時(shí),

            

            其線性網(wǎng)絡(luò)結(jié)構(gòu)如圖4所示,僅需N/Z個(gè)乘法器。

            

            3 FIR濾波器的硬件電路設(shè)計(jì)

            下面以一個(gè)32階FIR帶通濾波器為例說(shuō)明硬件電路設(shè)計(jì)的方法和過(guò)程。

            3.1 設(shè)計(jì)指標(biāo)

            采用頻率:200 Hz        類型:帶通

            上限截止頻率:54.3 Hz     下限截止頻率:46 Hz

            階數(shù):32階           系數(shù)數(shù)據(jù)寬度:16位

            輸入數(shù)據(jù)寬度:16位       輸出數(shù)據(jù)寬度:16位

            3.2 濾波器的設(shè)計(jì)

            使用MATLAB 7.1軟件中Filter Design&AnalysisTool,選取帶通濾波器,Kaiser窗設(shè)計(jì)方法,設(shè)計(jì)出符合設(shè)計(jì)指標(biāo)的32階線性相位FIR濾波器,其幅頻特性和相頻特性如圖5所示。

            

            濾波器的特征參數(shù)用16位二進(jìn)制補(bǔ)碼表示如下:

            

            3.3 硬件電路組成單元

            FIR濾波器的硬件電路包括數(shù)據(jù)位擴(kuò)展、并串轉(zhuǎn)換器、移位寄存器組、預(yù)相加單元、查找表單元、查表結(jié)果相加單元、移位累加單元、鎖存輸出單元、控制單元等,總的結(jié)構(gòu)如圖6所示。

            

            (1) 數(shù)據(jù)位擴(kuò)展:由于輸入數(shù)據(jù)要進(jìn)行預(yù)相加,為了防止溢出,保證電路正常工作,采用符號(hào)位擴(kuò)展,使輸入數(shù)據(jù)由16位增加到17位。

            (2) 并串轉(zhuǎn)換器:由于電路以串行方式工作,須將并行輸入的數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù)輸入,且順序是先輸入低位(LSB),后輸入高位(MSB)。

            (3) 移位寄存器組:其主要功能是用寄存器組存儲(chǔ)輸入序列,實(shí)現(xiàn)輸入數(shù)據(jù)的延時(shí)輸出,存儲(chǔ)的級(jí)數(shù)等于FIR濾波器的階數(shù)減1,即31。移位寄存器組輸出的數(shù)據(jù)和并串轉(zhuǎn)換器輸出的數(shù)據(jù)一起形成如圖1中所示的輸入數(shù)據(jù)陣列形式。

            (4) 預(yù)相加單元:利用FIR濾波器系數(shù)的對(duì)稱性,按照?qǐng)D4所示的FIR濾波器線性網(wǎng)絡(luò)結(jié)構(gòu),將相同濾波器系數(shù)相乘兩個(gè)輸入數(shù)據(jù)預(yù)先相加,這樣相當(dāng)于將濾波器的階數(shù)減半,減小了硬件規(guī)模。預(yù)相加單元采用在位串行電路中廣泛應(yīng)用的串行加法器來(lái)實(shí)現(xiàn)。

            (5) 查找表單元:如前所述,LUT的規(guī)模隨濾波器階數(shù)的增加呈指數(shù)增長(zhǎng),當(dāng)濾波器的階數(shù)很大時(shí),查找表的規(guī)模過(guò)于龐大。為了減小規(guī)模,可以將1個(gè)有16位地址總線的LUT分割,產(chǎn)生4個(gè)4位地址總線部分LUT,先分別對(duì)4個(gè)部分表查表,再將結(jié)果相加。為防止相加時(shí)產(chǎn)生溢出,將16位查表輸出經(jīng)過(guò)1位符號(hào)擴(kuò)展變?yōu)?7位。

            (6) 查表結(jié)果相加單元:加法器是影響FIR濾波器性能的主要部件,其工作速度決定了FIR濾波器的效率,因此采用具有超前進(jìn)位功能的流水線加法器。

            (7) 移位累加單元:得到的查表結(jié)果相當(dāng)于一個(gè)部分積,移位累加單元將其與寄存器中的部分積相加,結(jié)果右移1位還放入寄存器中,直到所有的位數(shù)都查表結(jié)束。特別應(yīng)注意,最高位查表得到的結(jié)果不是與上一個(gè)右移1位的部分積相加,而是相減。這里的加法器仍是采用具有超前進(jìn)位功能的流水線加法器,作減法時(shí),只需將被減數(shù)取補(bǔ)即可。

            (8) 鎖存輸出單元:加法器的輸出不穩(wěn)定,將其結(jié)果經(jīng)過(guò)一鎖存器得到穩(wěn)定的輸出。

            (9) 控制單元:產(chǎn)生復(fù)位,時(shí)序等控制信號(hào),控制電路的總體運(yùn)行。

            3.4 電路仿真

            在ALTERA公司的MAX+PLUS2軟件環(huán)境下,用硬件描述語(yǔ)言VHDL對(duì)上述FIR濾波器的模塊進(jìn)行編程描述,并仿真各模塊的波形,最后將各模塊綜合起來(lái)下載到器件FLEX10KE中形成FIR濾波器。

            用MATLAB設(shè)計(jì)了一幅度為0.22的50 Hz的正弦波,用250 Hz的采樣器對(duì)其采樣,得到周期序列[0,0.209 2,0.129 3,—0.129 3,—0.209 2],用16位二進(jìn)制補(bǔ)碼表示為:[0000H,1ACBH,108DH,EF73H,E538H],將其輸入到FIR濾波器的輸入端,濾波器的輸出如圖6所示,實(shí)驗(yàn)結(jié)果與理論計(jì)算一致。并取32位以后的輸出結(jié)果,在MATLAB里繪制波形,如圖7所示,可見,F(xiàn)PGA仿真結(jié)果正確,50 Hz的正弦波通過(guò)了FIR濾波器。

            

            4 結(jié) 論

            本文所介紹的基于FPGA、采用分布式算法實(shí)現(xiàn)FIR濾波器的方法,在提高系統(tǒng)運(yùn)行速度和節(jié)省硬件資源方面具有很大的優(yōu)勢(shì)。而且,通過(guò)改變階數(shù)和查找表中的系數(shù),還可以將此設(shè)計(jì)靈活地運(yùn)用于實(shí)現(xiàn)高通、低通和帶阻濾波器,可移植性較好。因此,這種方法在高速數(shù)字信號(hào)處理中將有很好的應(yīng)用前景。



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();