基于matlab與FPGA聯合仿真的FIR低通濾波器設計報告_第1頁
基于matlab與FPGA聯合仿真的FIR低通濾波器設計報告_第2頁
基于matlab與FPGA聯合仿真的FIR低通濾波器設計報告_第3頁
基于matlab與FPGA聯合仿真的FIR低通濾波器設計報告_第4頁
基于matlab與FPGA聯合仿真的FIR低通濾波器設計報告_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、FIR低通濾波器設計報告1. 設計內容本設計是基于FPGA的一個FIR低通濾波器設計,給定一段有高頻干擾的信號Hnoise.wav,要求使用matlab設計出一個低通濾波器濾除其干擾頻率,并取出10000到10160點進行時頻分析。然后使用verilog語言編寫出濾波器,聯合modelsim進行編譯仿真,并將結果與matlab結果進行對比。2. 設計原理FIR濾波器響應(簡稱FIR)系統的單位脈沖響應為有限長序列,系統函數 在有限z平面上不存在極點,其運算結構中不存在反饋支路,即沒有環路。如果的長度為N,則它的系統函數和差分方程一般具有如下形式:根據差分方程直接畫出FIR濾波器的結構,稱為直接

2、型結構。如圖所示:圖2.1 FIR濾波器直接結構FIR濾波器的特點:單位脈沖響應序列為有限個;可快速實現;可得到線性相位;濾波器階數較高。對線性時不變系統保持線性相位的條件是:單位脈沖響應為偶對稱或奇對稱。即:為設計線性濾波器,應保證h(n)為對稱的。1)若N為偶數,其線性相位FIR濾波器的對稱結構流圖:圖2.2 若N為偶數線性相位FIR濾波器的對稱結構流圖圖中:“ +1 ” 對應偶對稱情況,“ -1 ” 對應奇對稱情況。當n為奇數時,最后一個支路斷開。2)若N為奇數,其線性相位FIR濾波器的對稱結構流圖:圖2.3 N為奇數線性相位FIR濾波器的對稱結構流圖在本設計中,我們采用線性FIR低通濾

3、波器,所采用的階數N=8,所以是偶對稱的,估采取圖2.2的結構,其中“±1“取“1”。3. 設計思路首先要用matlab對給定的信號進行時頻分析來確定干擾信號的中心頻率,然后再設計出相應的數字濾波器進行濾波,最后要在FPGA上實現FIR濾波器。首先要確定濾波器的抽頭系數。其系數的確定,我們可以通過兩種辦法來實現:第一種就是通過matlab編寫FIR濾波器程序,然后直接導出抽頭系數“h(n)”,另外一種辦法就是使用matlab自帶的FDATOOL簡便地設計一個FIR濾波器,然后導出系數。考慮到要更直觀地描述FIR濾波器的設計,我采用了第二種方法,用fdatool設計濾波器并導出參數。設

4、計好濾波器后,接著要用matlab對給定的信號進行采樣,保存,量化,導出以供FPGA的FIR濾波器模塊使用。做好準備工作后,就可以在QUARTUSII里面編寫Verilog代碼了。由于是硬件描述語言,所以設計的思路很簡單,就是通過把輸入序列移位,然后首位對稱相加再乘以抽頭系數,然后把相乘結果再相加最后給輸出。其中涉及的難點是FPGA對有符號小數的乘法處理部分。在QUARTUSII編寫好模塊之后,就要用到modelsim來對設計進行仿真。對于仿真信號的輸入,我們直接使用系統函數$readmemh()來讀取matlab產生的信號采樣值,然后通過時鐘的驅動一個一個輸入到FIR濾波器模塊,最后在mod

5、elsim中顯示濾波器的輸出結果。驗證的最后一步,就是要把modelsim輸出的仿真結果用matlab進行繪圖,和之前matlab程序的輸出結果進行比較,從而驗證濾波器的設計是否成功。4. 設計過程1) 對信號進行時頻分析 語音信號是非平穩的隨機過程,頻率會隨著時間而變化。在語音信號處理研究領域,通常用短時間的傅里葉變換(STFT)來分析其時域和頻率特性,也就是在20ms50ms以內,可以將語音信號看成是平穩的隨機過程。平穩的隨機過程是功率信號,可以用功率譜來描述。所加的噪聲干擾是單音干擾,單音干擾是周期信號。這里提取了20ms的語音信號來分析其時域和頻域特性,由于采樣頻率是8000Hz,因此

6、我們利用了160個采樣點,起始點在第10001點,結束點在第10160點。 圖4.1 濾波前的時域圖 圖4.2 濾波前的頻譜圖 通過上圖可以看出信號在3800HZ左右的地方受到嚴重的干擾。 2) 使用matlab設計FIR濾波器用matlab設計線性FIR濾波器,首先要確定其指標,在本設計里,我們規定濾波器的指標如下:階數N=34,抽樣頻率fs=8000Hz,截止頻率為3300用窗函數設計FIR濾波器,窗函數選擇漢明窗。其幅頻響應如下:圖4.3 濾波器幅頻響應可以導出濾波器抽頭系數h(n)為:h =0.000780227960895479-0.001771093775299170.002033

7、79258009801-0.000494245608574501-0.003344650598584810.00754651554336203-0.00762305727075547-0.0002838373332175980.0145004055957633-0.02556763039525060.02040310781520230.00783243571565760-0.05010586343181080.0793218675548351-0.0569389948191050-0.06821550694176550.5819265274085500.581926527408550-0.06

8、82155069417655-0.05693899481910500.0793218675548351-0.05010586343181080.007832435715657600.0204031078152023-0.02556763039525060.0145004055957633-0.000283837333217598-0.007623057270755470.00754651554336203-0.00334465059858481-0.0004942456085745010.00203379258009801-0.001771093775299170.00078022796089

9、5479由于FPGA不支持浮點數的運算,所以我們采用定點數的格式來量化抽頭系數。對于16位的輸入數據,我們這里采用Q11的定點小數格式,即11位小數位,4位整數位,1位符號位。將抽頭系數乘以211可得:hn= 1-34-1-615-15029-524116-102162139-116162-1021641-52290-1515-6-14-31這樣我們就得到了34階FIR濾波器的量化系數了。確定好FIR濾波器的系數了,我們用matlab對信號進行濾波。 圖4.4 濾波后的信號時域圖 圖4.5 濾波后的信號頻譜圖可以看出信號的干擾已被濾除,接下來,就先把信號的采樣

10、值進行移位量化處理,然后保存到txt文件,供后續仿真使用,具體matlab代碼如下:值得一提的是此處還需要將數據轉換成16進制的格式才可以由modelsim直接讀取。具體可以matlab里使用dec2hex語句進行轉換。圖4.6 matlba命令將數據導出到txt中3) 用Verilog編寫濾波器模塊由于Verilog是一種行為描述語言,所以用來描述FIR的結構是很方便的,其關鍵程序就是有符號小數的乘法處理模塊。為了方便后續的仿真,整一個FIR濾波器程序可以分為兩個部分:FIR濾波器主程序以及有符號小數的乘法模塊。(2)FIR濾波器主程序:其主程序的變量定義如下: 圖4.7 主程序變量其中輸入

11、數據和濾波器的抽頭系數,都是16位,所以相加結果仍然是16位。相乘的結果用32位表示。為了防止相乘再相加后數據的溢出,我們在這里把存放相乘再相加的結果擴大了2位,用到34位,然后最后的輸出,在原來的基礎上再擴大1位,35位的輸出。在最后的輸出中,可以把低位去掉,只保留若干高位,但這里只需要仿真出結果便可,所以沒有進行截斷處理,然而在實際工程中,由于數位的限制,還是要注意這點。FIR主程序就是描述圖2.2的FIR濾波器結構,其行為描述,具體可以用以下代碼實現:其中x1x34通過前一個值對后一個值的賦值,可以實現移位操作;而s1s17是用來存放首位對稱相加的結果;然后y1y17是乘法輸出的結果,通

12、過y1到y17的累加,最后輸出到結果out。其中乘法的運算,我們調用17次乘法模塊(因為線性FIR濾波器是對稱結構,所以可以只進行34/2=17次的乘法運算。(3)乘法模塊對于有符號的小數運算,在FPGA里面,其實是和有符號整數的運算是一樣的。只是定點數的小數點的位置,我們需要牢記,在最后輸出結果的時候,要適當的進行移位。由于負數在Verilog中是以補碼形式保存的,所以在輸入16位有符號數的時候,在進行相乘之前,要把負數變為原碼再相乘,而正數的補碼就是其本身,所以不用轉換。然后把符號位提出來,進行異或運算,得到輸出的符號位,再把有效數位的原碼進行相乘,最后得到1位符號位和30位相乘結果。為了

13、補全32位,可以在最低位加上一個無關位0。最終輸出如果是負數,還需要把它變成補碼的形式輸出。至此,一個有符號的小數乘法運算就完成了。根據以上思路,我們可以寫出出乘法模塊的代碼:5. 分析驗證設計好以上模塊后,可以進行編譯綜合了。最后的編譯綜合結果如下圖所示:圖5.1 編譯結果從上圖可以看出,最后編譯成功,程序設計沒有語法錯誤。但具體要測試其工作是否正常,我們接下來,就需要用到modelsim對其進行仿真。我們要寫testbench文件,就需要三個輸入,一個輸出。其中一個輸入是時鐘,一個復位信號,還有隨時鐘變化的地址輸入和最后的輸出。根據此可以寫出測試文件:由于最后輸出的數是補碼,為了能在mod

14、elsim的下方報告欄能顯示出正常的十進制負數,我們定義了一個有符號寄存器out1,然后通過$display命令把結果按照時鐘一個個輸出到報告欄里。仿真得到的波形和結果如下圖所示:圖5.2modelsim仿真波形Modelsim會自動把濾波結束的數據寫入到一個fir_result文件中去用于matlab繪圖。圖5.3 modelsim產生的輸出文件可以看到數據中出現了很多2147xxxxxx的數,這些數其實是補碼的的十進制形式。運算的過程中出現的bug,暫時還沒法解決。但是可以用matlab將數據變成正常的形式。只要執行下面命令即可解決: 由于我們沒有對輸出的35位數據進行截斷處理,所以在最后的輸出結果,我們要處以22

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論