FIR(Finite Impulse Response)濾波器是一種有限長單位沖激響應濾波器,又稱為非遞歸型濾波器。FIR 濾波器具有嚴格的線性相頻特性,同時其單位響應是有限長的,因而是穩(wěn)定的系統(tǒng),在數(shù)字通信、圖像處理等領域都有著廣泛的應用。
FIR 濾波器原理
FIR 濾波器是有限長單位沖擊響應濾波器。直接型結構如下:
FIR 濾波器本質(zhì)上就是輸入信號與單位沖擊響應函數(shù)的卷積,表達式如下:
FIR 濾波器有如下幾個特性:
(1) 響應是有限長序列。
(2) 系統(tǒng)函數(shù)在 |z| > 0 處收斂,極點全部在 z=0 處,屬于因果系統(tǒng)。
(3) 結構上是非遞歸的,沒有輸出到輸入的反饋。
(4) 輸入信號相位響應是線性的,因為響應函數(shù) h(n) 系數(shù)是對稱的。
(5) 輸入信號的各頻率之間,相對相位差也是固定不變的。
(6) 時域卷積等于頻域相乘,因此該卷積相當于篩選頻譜中各頻率分量的增益倍數(shù)。某些頻率分量保留,某些頻率分量衰減,從而實現(xiàn)濾波的效果。
并行 FIR 濾波器設計
◆設計說明
輸入頻率為 7.5 MHz 和 250 KHz 的正弦波混合信號,經(jīng)過 FIR 濾波器后,高頻信號 7.5MHz 被濾除,只保留 250KHz 的信號。設計參數(shù)如下:
輸入頻率: 7.5MHz 和 250KHz
采樣頻率: 50MHz
阻帶: 1MHz ~ 6MHz
階數(shù): 15(N-1=15)
由 FIR 濾波器結構可知,階數(shù)為 15 時,F(xiàn)IR 的實現(xiàn)需要 16 個乘法器,15 個加法器和 15 組延時寄存器。為了穩(wěn)定第一拍的數(shù)據(jù),可以再多用一組延時寄存器,即共用 16 組延時寄存器。由于 FIR 濾波器系數(shù)的對稱性,乘法器可以少用一半,即共使用 8 個乘法器。
并行設計,就是在一個時鐘周期內(nèi)對 16 個延時數(shù)據(jù)同時進行乘法、加法運算,然后在時鐘驅(qū)動下輸出濾波值。這種方法的優(yōu)點是濾波延時短,但是對時序要求比較高。
◆并行設計
設計中使用到的乘法器模塊代碼,可參考之前流水線式設計的乘法器。
為方便快速仿真,也可以直接使用乘號 “*” 完成乘法運算,設計中加入宏定義 SAFE_DESIGN 來選擇使用哪種乘法器。
FIR 濾波器系數(shù)可由 matlab 生成,具體見附錄。
/***********************************************************
> > V201001 : Fs:50Mhz, fstop:1Mhz-6Mhz, order: 15
************************************************************/
`define SAFE_DESIGN
module fir_guide (
input rstn, //復位,低有效
input clk, //工作頻率,即采樣頻率
input en, //輸入數(shù)據(jù)有效信號
input [11:0] xin, //輸入混合頻率的信號數(shù)據(jù)
output valid, //輸出數(shù)據(jù)有效信號
output [28:0] yout //輸出數(shù)據(jù),低頻信號,即250KHz
);
//data en delay
reg [3:0] en_r ;
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
en_r[3:0] <= 'b0 ;
end
else begin
en_r[3:0] <= {en_r[2:0], en} ;
end
end
//(1) 16 組移位寄存器
reg [11:0] xin_reg[15:0];
reg [3:0] i, j ;
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
for (i=0; i< 15; i=i+1) begin
xin_reg[i] <= 12'b0;
end
end
else if (en) begin
xin_reg[0] <= xin ;
for (j=0; j< 15; j=j+1) begin
xin_reg[j+1] <= xin_reg[j] ; //周期性移位操作
end
end
end
//Only 8 multipliers needed because of the symmetry of FIR filter coefficient
//(2) 系數(shù)對稱,16個移位寄存器數(shù)據(jù)進行首位相加
reg [12:0] add_reg[7:0];
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
for (i=0; i< 8; i=i+1) begin
add_reg[i] <= 13'd0 ;
end
end
else if (en_r[0]) begin
for (i=0; i< 8; i=i+1) begin
add_reg[i] <= xin_reg[i] + xin_reg[15-i] ;
end
end
end
//(3) 8個乘法器
// 濾波器系數(shù),已經(jīng)過一定倍數(shù)的放大
wire [11:0] coe[7:0] ;
assign coe[0] = 12'd11 ;
assign coe[1] = 12'd31 ;
assign coe[2] = 12'd63 ;
assign coe[3] = 12'd104 ;
assign coe[4] = 12'd152 ;
assign coe[5] = 12'd198 ;
assign coe[6] = 12