1. 程式人生 > >濾波器開篇,線性相位FIR濾波器的FPGA實現

濾波器開篇,線性相位FIR濾波器的FPGA實現

         可以看到,經濾波器濾波後,頻率為400hz的訊號被保留,時域訊號是完整的正弦波,有些朋友可能會說,怎麼會有失真呢?失真可能是有點,但是還是由於我們的取樣頻率不夠高,都是還原的波形不夠圓滑。還有人可能會說,根據時域取樣定理,不是取樣頻率大於2倍的訊號頻率就可以被還原成原始訊號嗎?但是我們這裡並不是還原原始訊號,這還是數字訊號,只是將濾波後離散的點用線連起來了而已。 9、FIR濾波器的FPGA實現       好了,matlab模擬成功,剩下的就需要在FPGA上實現了,在FPGA上實現什麼呢?前面我們已經得到了濾波器的係數,只要有了濾波器係數,剩下的不就是乘積累加了麼,所以,我們需要在FPGA上實現訊號的乘積累加,即對疊加訊號和濾波器係數的乘積累加。 濾波器係數已經有了,那麼訊號在哪呢?我們可以利用matlab將生成的疊加訊號以2進位制的形式寫到一個檔案中去,注意是12bit量化。那也就是說,每一個數據是由12位二進位制組成的,根據取樣頻率,共有2000個數據,這2000個數據,全部用二進位制補碼錶示,共同組成了一個疊加訊號,至於怎麼將資料寫到檔案中去,這裡不解釋,大家可以自己下載程式碼,自己學習      有了濾波器係數,有了輸入訊號,下面就可以設計硬體電路了,根據線性卷積的原理,需要將輸入訊號和濾波器係數進行乘積累加,由於我們的濾波器是線性相位的,即關於(N-1)/2 偶對稱,這裡我們設計的濾波器階數為23,這個引數是由kaiserord函式返回來得到的,也就是說濾波器長度是24,而且又是偶對稱的,所以只需要將輸入訊號的對稱位數與濾波器係數的前半部分相乘即可,即只需乘到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個位寬為12的移位暫存器,即每隔一段時間輸入一個位寬為12bit的數,這個時間就是一個數據週期,在資料週期內要完成一個數的線性卷積運算,由於我們的濾波器長度是24,這裡定義暫存器長度也為24。         data_a 是累加器的加數a,將輸入的第一個資料與他的最高位位,即符號位拼接來擴充套件為13位的資料,因為兩個12位的數相加,為了保證符號位不溢位,需要13位的位寬,而要得到13位的輸出結果,因為我們是呼叫加法器IP核的,所以輸入的資料位寬也要是13位位寬。         data_b是移位暫存器的最高位內的資料,將移位暫存器的最高位與最低位相加,在跟濾波器係數相乘,同理將次低位與次高位相乘,等到一個數據的12位全部與濾波器係數相乘完畢之後,將資料輸出,一個數據的濾波完成,接著送來下一個12位的資料,繼續進行卷積運算,一直等到所有資料(2000個點)濾波完成。          hn是由matlab生成的濾波器係數,共有24個,全部是經過12bit量化後的由16進位制數表示的,我們直接呼叫就行,由於他的對稱性,我們只需要呼叫前12個即可,後12個引數跟前12個引數是對稱的          上面這個過程需要進行11次,因為每次將兩個數進行乘積,等到11次累乘結束,就要將這11累乘的結果累加並輸出,得到一個點的濾波結果