版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、QQ:290632690 膚淺。制作圖3用MATLAB回讀C盤根目錄下的matlab_wave_data.txt文件,驗證存入的波形數(shù)據(jù)是否正確,MATLAB代碼如下:fid = fopen('c:/matlab_wave_data.txt','r');for i = 1 : 5001;%一共有5001個數(shù)據(jù)num(i) = fscanf(fid, '%x', 1);%從fid所指的文件中,以16進制的方式讀出一個數(shù)據(jù)endfclose(fid);figure(2);plot(num,'b');legend('MATLAB
2、從txt文件中讀出的原始疊加波形數(shù)據(jù)');title('直接回讀MATLAB產生的兩個正弦信號的疊加波形'); 顯示的波形如圖4所示:圖4對比圖4和圖2中的疊加波形,可知以上操作的正確性。1) 用MATLAB設計FIR濾波器輸入信號是頻率別為0.5MHz和2MHz的正弦信號的疊加,我們的任務是設計一個低通濾波器濾除掉2MHz的干擾信號。因此,我們可以設計一個采樣率為25MHz的低通濾波器,其通帶帶寬為1MHz,阻帶寬度為2MHz。通帶內紋波抖動為1dB,阻帶下降為80dB。在MATLAB的命令窗口輸入:fdatool命令并回車,打開FDATool工具箱,用MATLAB的
3、FDATool工具設計該濾波器,參數(shù)設置如圖5所示:設計好參數(shù)后,點擊DesignFilter,可以在FDATool窗口的左上角看到濾波器的階數(shù)為63階,點擊File àGenerate M-file,并將濾波器命名為mylowfilter。圖5 編寫如下代碼,濾除混疊信號中的高頻信號。Hd = mylowfilter; % 濾波器名稱output = filter(Hd, y1); % 對疊加信號 y ,進行濾波處理figure(3);plot(y2, 'k');hold on;plot(output, 'r');legend('0.5MHz
4、原始信號','濾波后取出的信號');title('信號通過MTALAB的低通濾波器后的波形'); 濾波后的波形如圖6所示:圖6生成.coe文件,用于Xilinx的IPCore設計濾波器,F(xiàn)DATool窗口點擊File àExport,保持默認設置,點擊Export即可,次數(shù)在MATLAB的workspace窗口多出一個Num的1*64的數(shù)組,這就是濾波器的系數(shù),如圖7所示:圖7由于MATLAB生成的濾波器系數(shù)全是一些小數(shù),而FPGA只能處理整數(shù),因此我們必須將這些小數(shù)擴大一定的倍數(shù),使它們變成整數(shù)。在MATLAB的命令窗口輸入下面的一段代碼然后
5、按Enter,即可將上面這些系數(shù)變?yōu)檎麛?shù),注意這里的*32767,表示將系數(shù)擴大32767倍,這里的擴大倍數(shù)只能選2N,目的是為了后面濾波后的波形數(shù)據(jù)的高位截取(丟掉低位,即除以2N)。返回ans=0,表示操作正確。coeff=round(Num/max(abs(Num)*32767);% abs() 求絕對值,max() 求最大值,round() 四舍五入fid = fopen('e:/fircoe.txt','wt'); %將濾波器系數(shù)寫入文件件中fprintf(fid,'%16.0fn',coeff);% 將濾波器系數(shù)以16位浮點數(shù)的格式保
6、存fclose(fid) 程序運行的結果如圖8所示:圖8將文件的格式改為.coe格式,在文件的開口加上:radix = 10;coefdata = 圖11圖12FIR的IPCore的列化如下:FIR16_IP FIR16_IP_ins (.clk(clk), / input clk.rfd(rfd), / output rfd 在其上升沿將輸入數(shù)據(jù)加載到濾波器內核中.rdy(rdy), / output rdy 在其上升沿輸出濾波器的計算結果.din(data_in_reg), / input 15 : 0 din.dout(dout); / output 35 : 0 dout 特別注意這個
7、數(shù)據(jù)位寬我們主要對其進行簡單的控制:在rfd 上升沿將輸入數(shù)據(jù)加載到濾波器內核中,在rdy 上升沿輸出濾波器的計算結果。具體的Verilog代碼如下:always (posedge clk) beginif(reset = 1'b0) begini<=1'b0;m<=1'b0;data_in_reg<=16'h0000;endelse beginrfd_1q<=rfd;rfd_2q<=rfd_1q;if(rfd_1q & rfd) begin/ rfd 信號的上升沿將輸入數(shù)據(jù)加載到濾波器內核中data_in_reg<=
8、data_ini;i <=i + 1;m <=m;if(i = 2002)i<=0;endendendalways (posedge clk) beginif(reset = 1'b0) beginData_out_reg<=0;j<=0;n<=0;endelse beginrdy_1q<=rdy;rdy_2q<=rdy_1q;if(rdy_1q & rdy) beginData_out_reg<=dout;j<=j + 1'b1;n <=n;endendend這里還做了一個附加功能,將FIR濾波器的輸入
9、數(shù)據(jù)存放到一個.txt文件當中,然后用MATLAB去讀取這個波形文件數(shù)據(jù),看看讀出的波形是否和原來的混疊波形一樣。具體的Verilog和MATLAB代碼如下:integer wr_file;initial wr_file = $fopen("c:/FIR_in_data.txt");always ( m ) beginif(reset = 1'b1) begin$fdisplay(wr_file,"%h", data_in_reg);/ 33bit數(shù)if(j = 11'd2002) /共寫入2001個數(shù)據(jù)$stop;endendfid =
10、 fopen('c:/FIR_in_data.txt','r');for j = 1 : 2000;num1(j) = fscanf(fid, '%x', 1);%這句話的意思是從fid所指的文件以16進制方式讀出一個數(shù)據(jù)。endfclose(fid);figure(4);plot(num1,'r');legend('Verilog讀出的txt文件中的數(shù)據(jù)');title('FIR濾波器的輸入數(shù)據(jù)'); MATLAB讀出的波形數(shù)據(jù)如圖13所示:圖13這里我也搞了好久才搞好,這里FIR濾波器的輸出數(shù)據(jù)
11、位寬變成了36bit,而輸入數(shù)據(jù)位寬是16bit,為什么數(shù)據(jù)會變大幾萬倍呢?因為我們在將濾波器的系數(shù)由小數(shù)變成整數(shù)的時候,對這些系數(shù)整體擴大了32767倍,再做了一個四舍五入(影響濾波器精度),對濾波器的系數(shù)擴大的倍數(shù)越大,四舍五入對精度的影響就越小,但是系數(shù)乘的倍數(shù)越大,F(xiàn)PGA在做乘加運算也就越復雜,也就越耗時,越耗資源,因此我們需要找一個平衡點。這里為了將信號的幅度變回原始的幅度(盡可能的靠近),我們只能通過將低位截取掉,截取低位相當于對數(shù)據(jù)做除法(除2),所以前面的濾波器系數(shù)的擴大倍數(shù)我們一定要用2N,這樣我們在這里還原信號幅度的時候,只需要截位就能達到目的。比如這里我們對濾波器的系數(shù)
12、乘了32767,那我們在做除法還原波形幅度時,只需要除以32767即可(即截掉低16bit)。還有一種操作方式就是我們只保留數(shù)據(jù)的高16bit(和輸入數(shù)據(jù)的位寬保持一致),這兩種方式波形的幅度也就幾倍的差距,我還沒有完全搞懂這里,究竟怎樣才能將波形的幅度完全的還原回去,還是一個值得好好思考的問題?另一個問題是我的電腦是32bit位寬的,如果我們一次性讓MATLAB讀取36bit的數(shù)據(jù)那么數(shù)據(jù)的高4bit會讀不上來,會導致很奇怪的波形,我也遇到了這個問題。如圖14所示,波形明顯可以通過一些平移拼合成一個正弦波。通過對波形數(shù)據(jù)一個個的分析,我找到了這個問題。圖14圖15是波形幅度發(fā)生變化的截圖:圖
13、15字濾波器的性能,肯定能夠大大的縮短設計周期,提升濾波器性能。附錄:附錄為Verilog源代碼和MATLAB源代碼,這些源代碼是經過調試的,是可以直接使用的。供大家參考。Verilog源代碼:module FIR_Lowpass(clk,reset, Data_out);inputclk;inputreset;output31 :0Data_out;reg35 :0Data_out_reg;reg 10:0 i = 0;reg 10:0 j = 0;reg 15 :0 data_in0:2000; /定義一個16bit * 2001的數(shù)組reg 15:0 data_in_reg = 0;in
14、itial begin/ 讀出MATLAB產生的波形數(shù)據(jù) 0.5MHz_sin + 4MHz_sin 信號$readmemh("c:/matlab_wave_data.txt", data_in); /將 matlab_wave_data.txt中的數(shù)據(jù)讀入存儲器 data_inendwirerfd;wirerdy;wire 35:0dout;regrfd_1q;regrfd_2q;regrdy_1q;regrdy_2q;regn = 0;regm = 0;always (posedge clk) beginif(reset = 1'b0) begini<=1
15、'b0;m<=1'b0;data_in_reg<=16'h0000;endelse beginrfd_1q<=rfd;rfd_2q<=rfd_1q;if(rfd_1q & rfd) begin/ rfd 信號的上升沿將輸入數(shù)據(jù)加載到濾波器內核中data_in_reg<=data_ini;i <=i + 1;m <=m;if(i = 2002)i<=0;endendendFIR16_IP FIR16_IP_ins (.clk(clk), / input clk.rfd(rfd), / output rfd 在其上升沿
16、將輸入數(shù)據(jù)加載到濾波器內核中.rdy(rdy), / output rdy 在其上升沿輸出濾波器的計算結果.din(data_in_reg), / input 15 : 0 din.dout(dout); / output 35 : 0 doutalways (posedge clk) beginif(reset = 1'b0) beginData_out_reg<=0;j<=0;n<=0;endelse beginrdy_1q<=rdy;rdy_2q<=rdy_1q;if(rdy_1q & rdy) beginData_out_reg<=d
17、out;j<=j + 1'b1;n <=n;endendend/剛剛的問題是,matlab讀一個數(shù)據(jù)是32bit的,而FIR的輸出是36bit的,因此高4bit根本沒有讀上來。/ assignData_out31:0 = Data_out_reg35:4;assignData_out31:0 = Data_out_reg35:4;/*integer wr_file;initial wr_file = $fopen("c:/FIR_in_data.txt");always ( m ) beginif(reset = 1'b1) begin$fdis
18、play(wr_file,"%h", data_in_reg);/ 33bit數(shù)if(j = 11'd2002) /共寫入2001個數(shù)據(jù)$stop;endend/*integer w_file;initial w_file = $fopen("c:/FIR_out.txt");always ( n ) beginif(reset = 1'b1) begin$fdisplay(w_file,"%h", Data_out31:14);/ 33bit數(shù)if(j = 11'd2002) /共寫入2001個數(shù)據(jù)$stop
19、;endendendmoduleMATLAB源代碼%* MATLAB產生信號并保存到.txt文件中 *clear all;fs = 25000000; % 25M 采樣率t = 0:1/fs:0.0002;% 共0.0002 * 25000000 = 5000個點f1 = 500000;f2 = 2000000;signal1 = sin(2*pi*f1*t); % 頻率為 0.5MHz 的正弦信號signal2 = sin(2*pi*f2*t); % 頻率為 4.0MHz 的正弦信號%y1 = signal1 + signal2; % 兩個正弦信號疊加%x = linspace(0, 12.
20、56, 2048); % 在區(qū)間0,6.28 = 2*pi 之間等間隔的取1024個點%y1 = sin(x); % 計算相應的余弦值% 由于正、余弦波形的值在0,1之間,需要量化成16bit,先將數(shù)值放大%y1 = y1 * 32768; % 32 * 1024 = 32768%y1 = y1 * 16384; % 32 * 1024 = 32768%y1 = y1 + 32768;y2 = fix(16384 + (214 - 1) * signal1);y3 = fix(16384 + (214 - 1) * signal2);y1 = y2 + y3;% 再將放大的浮點值量化,并寫道到
21、存放在C盤的文本中fid = fopen('c:/matlab_wave_data.txt', 'wt');%fprintf(fid, '%16.0fn', y1); % 在寫文件時量化為16bit的定點實數(shù)【%16.0f,16.0表示16bit定點數(shù),f表示實數(shù)】,范圍是: -32768 - 32767fprintf(fid, '%xn', y1); % 在寫文件時量化為16bit的定點實數(shù)【%16.0f,16.0表示16bit定點數(shù),f表示實數(shù)】,范圍是: -32768 - 32767fclose(fid);figure(1)
22、;plot(y2, 'b');hold on;plot(y3, 'b');hold on;plot(y1, 'r');legend('0.5MHz正弦','2MHz正弦','兩者疊加');title('MATLAB產生的兩個正弦信號的疊加波形');%* MATLAB回讀保存到.txt文件中的信號 *fid = fopen('c:/matlab_wave_data.txt','r');for i = 1 : 5001;%num(i) = fscanf(f
23、id, '%f', 1);%從fid所指的文件中,以實數(shù)的方式讀出一個數(shù)據(jù)num(i) = fscanf(fid, '%x', 1);%從fid所指的文件中,以實數(shù)的方式讀出一個數(shù)據(jù)endfclose(fid);figure(2);plot(num,'b');legend('MATLAB從txt文件中讀出的原始疊加波形數(shù)據(jù)');title('直接回讀MATLAB產生的兩個正弦信號的疊加波形');%* MATLAB設計FIR濾波器并對比濾波器前后的波形 *Hd = mylowfilter; % 濾波器名稱output = filter(Hd, y1); % 對疊加信號 y ,進行濾波處理figure(3);plot(y2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度高級項目經理聘用合同模板
- 二零二五年度二手房交易樣本:共有產權房買賣合同3篇
- 2024年網絡安全防護設備研發(fā)保密合同范本3篇
- 二零二五年度合同單方面更改可能涉及的法律風險合同3篇
- 2024年針對串通借貸糾紛的協(xié)議答辯文案版
- 二零二五年大數(shù)據(jù)分析平臺建設項目合同協(xié)議3篇
- 2025年度淋浴房智能化升級改造合作協(xié)議2篇
- 2025年度洗衣店員工培訓與就業(yè)指導合同范本3篇
- 2024年跨境電子商務平臺建設與合作合同
- 二零二五年度住宅小區(qū)景觀綠化施工合同5篇
- 基于老舊小區(qū)加裝電梯特殊安全及風險控制的研究
- 甘肅省蘭州市(2024年-2025年小學三年級語文)人教版綜合練習(上學期)試卷(含答案)
- 2024年人教版小學四年級信息技術(上冊)期末試卷及答案
- 中建醫(yī)療工程交付指南
- 譯林版小學英語二年級上全冊教案
- DL∕T 821-2017 金屬熔化焊對接接頭射線檢測技術和質量分級
- DL∕ T 1195-2012 火電廠高壓變頻器運行與維護規(guī)范
- 小學五年級英語語法練習
- NB-T32004-2018光伏并網逆變器技術規(guī)范
- 領導與班子廉潔談話記錄(4篇)
- 衡陽市耒陽市2022-2023學年七年級上學期期末語文試題【帶答案】
評論
0/150
提交評論