基于FPGA低通濾波器的FIR的設(shè)計
掃描二維碼
隨時隨地手機看文章
基于FPGA低通濾波器FIR的設(shè)計
1 濾波器的特征參數(shù)介紹
2 設(shè)計目標(biāo)
要求:使用fir濾波器設(shè)計一個濾波器系數(shù)為15階的低通濾波器,通帶截止頻率為1KHZ,采樣頻率為44.1khz。
3 matlab的設(shè)計驗證
close all clear all clc %設(shè)計一個低通濾波器 采樣頻率為44.1khz, 截止頻率為1khz FS = 44100; %HZ fc = 1000; N = 15; Q = 16; %以采樣頻率的一半,對頻率進行歸一化處理 wn_lpf=fc*2/FS; %采用fir1函數(shù)設(shè)計FIR濾波器 b_lpf=fir1(N-1,wn_lpf); %濾波系數(shù)進行量化 b_16=round(b_lpf/max(abs(b_lpf))*(2^(Q-1)-1)); %求濾波器的幅頻響應(yīng) m_lpf=20*log(abs(fft(b_lpf)))/log(10); b16_lpf=20*log(abs(fft(b_16)))/log(10); %設(shè)置幅頻響應(yīng)的橫從標(biāo)單位為Hz x_f=[0:(FS/length(m_lpf)):FS/2]; %繪制單位脈沖響應(yīng) subplot(221);stem(b_lpf);xlabel('n');ylabel('h(n)'); title('低通濾波器的單位脈沖響應(yīng)','fontsize',8); subplot(222);stem(b_16);xlabel('n');ylabel('h(n)'); title('低通濾波器的單位脈沖響應(yīng)','fontsize',8); %繪制幅頻響應(yīng)曲線 subplot(223);plot(x_f,m_lpf(1:length(x_f)));xlabel('頻率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8); title('低通濾波器的幅頻響應(yīng)','fontsize',8); subplot(224);plot(x_f,b16_lpf(1:length(x_f)));xlabel('頻率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8); title('低通濾波器的幅頻響應(yīng)','fontsize',8);
4 FPGA信號發(fā)生器
為了驗證低通濾波器,我們設(shè)計了測試驗證的sin信號發(fā)生器。
wire [17:0] kfreq= (k<2048)?18’h00333:18’h00FFF;//1khz-5khz
產(chǎn)生1khz和5khz的sin波。
測試源的FFT分析:
圖4 測試源數(shù)據(jù)的matlab分析
由圖4的頻域圖可知,測試源產(chǎn)生了1khz和5khz的sin。
5 FPGA的fir設(shè)計
Fir濾波器verilog代碼設(shè)計采取全并行模式。
`timescale 1ps/1ps module fir1( input mclk,//45.1584MHZ input reset_n, input signed[31:0] pcm_in, output signed[31:0] pcm_out ); localparam LAST_CYCLE = 1023; reg [9:0] i; reg signed [31:0] pcm1,pcm2,pcm3,pcm4,pcm5,pcm6,pcm7,pcm8,pcm9,pcm10,pcm11,pcm12,pcm13,pcm14,pcm15; reg signed [47:0] pcm1_out,pcm2_out,pcm3_out,pcm4_out,pcm5_out,pcm6_out,pcm7_out,pcm8_out,pcm9_out,pcm10_out,pcm11_out,pcm12_out,pcm13_out,pcm14_out,pcm15_out; reg signed [51:0] pcm_r; wire signed [15:0] coeff1,coeff2,coeff3,coeff4,coeff5,coeff6,coeff7,coeff8,coeff9,coeff10,coeff11,coeff12,coeff13,coeff14,coeff15; assign coeff1 = 2208; assign coeff2 = 3631; assign coeff3 = 7612; assign coeff4 = 13576; assign coeff5 = 20413; assign coeff6 = 26727; assign coeff7 = 31169; assign coeff8 = 32767; assign coeff9 = 31169; assign coeff10 = 26727; assign coeff11 = 20413; assign coeff12 = 13576; assign coeff13 = 7612; assign coeff14 = 3631; assign coeff15 = 2208; assign pcm_out = pcm_r[51:20]; always @(posedge mclk or negedge reset_n) begin if(!reset_n) begin i<= 0; pcm1<=0; pcm2<=0; pcm3<=0; pcm4<=0; pcm5<=0; pcm6<=0; pcm7<=0; pcm8<=0; pcm9<=0; pcm10<=0; pcm11<=0; pcm12<=0; pcm13<=0; pcm14<=0; pcm15<=0; pcm1_out<=0; pcm2_out<=0; pcm3_out<=0; pcm4_out<=0; pcm5_out<=0; pcm6_out<=0; pcm7_out<=0; pcm8_out<=0; pcm9_out<=0; pcm10_out<=0; pcm11_out<=0; pcm12_out<=0; pcm13_out<=0; pcm14_out<=0; pcm15_out<=0; pcm_r<= 0; end else begin i <= i + 1; if(i == 0) begin pcm1<=pcm_in; pcm2<=pcm1; pcm3<=pcm2; pcm4<=pcm3; pcm5<=pcm4; pcm6<=pcm5; pcm7<=pcm6; pcm8<=pcm7; pcm9<=pcm8; pcm10<=pcm9; pcm11<=pcm10; pcm12<=pcm11; pcm13<=pcm12; pcm14<=pcm13; pcm15<=pcm14; end if(i==1) begin pcm1_out <= pcm1*coeff1; pcm2_out <= pcm2*coeff2; pcm3_out <= pcm3*coeff3; pcm4_out <= pcm4*coeff4; pcm5_out <= pcm5*coeff5; pcm6_out <= pcm6*coeff6; pcm7_out <= pcm7*coeff7; pcm8_out <= pcm8*coeff8; pcm9_out <= pcm9*coeff9; pcm10_out <= pcm10*coeff10; pcm11_out <= pcm11*coeff11; pcm12_out <= pcm12*coeff12; pcm13_out <= pcm13*coeff13; pcm14_out <= pcm14*coeff14; pcm15_out <= pcm15*coeff15; end if(i==2) pcm_r<= pcm1_out +pcm2_out+pcm3_out+pcm4_out+pcm5_out+pcm6_out+pcm7_out+pcm8_out+pcm9_out+pcm10_out+pcm11_out+pcm12_out+pcm13_out+pcm14_out+pcm15_out; end end endmodule
fpga實驗modelsim仿真結(jié)果,從圖5來看1khz幾乎保持不變,而5khz波形幅度上被抑制了很多。
圖5 modelsim fir實驗結(jié)果時域波形
Matlab fft分析:
由圖2和圖6對比,5khz經(jīng)過濾波后的功率減小了20DB,圖2與圖5基本一致,fir的低通濾波器全并行設(shè)計成功。