數(shù)字濾波器
數(shù)字濾波器從實(shí)現(xiàn)結(jié)構(gòu)上劃分,有FIR和IIR兩種。FIR的特點(diǎn)是:線(xiàn)性相位、消耗資源多;IIR的特點(diǎn)是:非線(xiàn)性相位、消耗資源少。由于FIR系統(tǒng)的線(xiàn)性相位特點(diǎn),設(shè)計(jì)中絕大多數(shù)情況都采用FIR濾波器。
線(xiàn)性相位系統(tǒng)的意義,這里的線(xiàn)性相位指的是在設(shè)計(jì)者關(guān)心的通帶范圍內(nèi),LTI系統(tǒng)滿(mǎn)足線(xiàn)性相位要求:
從延時(shí)的角度看:保證了輸入信號(hào)的相位響應(yīng)是線(xiàn)性的,即保證了輸入信號(hào)的延時(shí)特性。
從相位的角度看:輸入的各頻率成分的信號(hào)之間,相對(duì)相位是固定的。通過(guò)線(xiàn)性相位系統(tǒng)后,相對(duì)相位關(guān)系保持不變。
對(duì)于關(guān)心相位的系統(tǒng),比如調(diào)制解調(diào)系統(tǒng),需要使用FIR濾波器;對(duì)于只關(guān)心頻率成分的系統(tǒng),比如只是提取某一頻率分量,為了節(jié)省資源,使用IIR濾波器即可。
FIR濾波器
FIR的最大特點(diǎn)就是其系統(tǒng)響應(yīng) h(n)是一個(gè)N點(diǎn)的有限長(zhǎng)序列,F(xiàn)IR的輸出y(n)本質(zhì)上就是輸入信號(hào)x(n)和h(n)的卷積(根據(jù)傅里葉變換性質(zhì),時(shí)域卷積等于頻域相乘,因此卷積相當(dāng)于篩選頻譜中的各頻率分量的增益倍數(shù),某些頻率分量保留,某些頻率分量衰減,從而實(shí)現(xiàn)濾波效果)。FIR在實(shí)現(xiàn)上的本質(zhì)是帶抽頭延遲的加法器和乘法器的組合,每一個(gè)乘法器對(duì)應(yīng)一個(gè)系數(shù)。
由理論知識(shí)可知,只有當(dāng)FIR的h(n)對(duì)稱(chēng)時(shí),F(xiàn)IR濾波器才具有線(xiàn)性相位特性。使用MATLAB等工具設(shè)計(jì)FIR時(shí),得到的h(n)也都是具有對(duì)稱(chēng)性的。
FIR濾波器的實(shí)現(xiàn)結(jié)構(gòu)主要有直接型、級(jí)聯(lián)型、頻率取樣型、格型四種。其中最適合FPGA實(shí)現(xiàn)的是直接型?!爸苯印笔侵钢苯佑删矸e公式得到:
由上圖可知,n階FIR濾波器就需要n個(gè)乘法器。如果設(shè)計(jì)的是線(xiàn)性相位FIR,則h(n)是對(duì)稱(chēng)的,利用對(duì)稱(chēng)性可以節(jié)省一半的乘法器。
FIR濾波器的設(shè)計(jì)方法有窗函數(shù)法、頻率取樣法、等波紋切比雪夫逼近法(也叫最優(yōu)設(shè)計(jì)法)等等。以上所有的理論知識(shí)點(diǎn)在任意一本數(shù)字信號(hào)處理課本中都有詳細(xì)的推論,本文節(jié)省篇幅不再贅述。
MATLAB設(shè)計(jì)
雖然Quartus和Vivado的FIR IP核中都提供了設(shè)計(jì)FIR濾波器的功能,但遠(yuǎn)沒(méi)有MATLAB設(shè)計(jì)便捷和強(qiáng)大。設(shè)計(jì)中通常都是在MATLAB中設(shè)計(jì)好FIR的單位脈沖響應(yīng)h(n),或者說(shuō)濾波器系數(shù),量化后應(yīng)用到FPGA設(shè)計(jì)中。
MATLAB提供了基于窗函數(shù)設(shè)計(jì)法的fir1函數(shù)、設(shè)計(jì)任意響應(yīng)濾波器的fir2函數(shù)、最優(yōu)設(shè)計(jì)法的firpm函數(shù),以及兩個(gè)應(yīng)用程序包“Filter Builder”和“Filter Design&Analysis”,后者通常也被稱(chēng)作FDATOOL?,F(xiàn)在最受歡迎的設(shè)計(jì)方式恐怕就是使用FDATOOL工具,功能強(qiáng)大、界面便捷,且可以直接導(dǎo)出xilinx公司IP核所需的coe文件。
本系列主要是講述FPGA設(shè)計(jì),不詳細(xì)討論上述函數(shù)及工具的使用,具體情況可以的MATLAB的help中查詢(xún)。(Ps:博主目前的幾個(gè)系列都處于開(kāi)篇階段,篇幅不多,暫未成體系,目前不再開(kāi)新坑,等后期應(yīng)該會(huì)出一個(gè)“MATLAB數(shù)字信號(hào)處理系列”)
FPGA設(shè)計(jì)
從MATLAB到FPGA最重要的工作便是濾波器系數(shù)的量化?,F(xiàn)在的計(jì)算機(jī)大多都是64位的,然而為了節(jié)省資源,F(xiàn)PGA中進(jìn)行如此高位寬的運(yùn)算步進(jìn)浪費(fèi)資源而且也沒(méi)有必要。在MATLAB中將濾波器系數(shù)量化為指定位寬,會(huì)改變?yōu)V波器的頻率特性,因此需要做好仿真,確定量化后的系數(shù)也能滿(mǎn)足FIR的設(shè)計(jì)需求。
由上節(jié)可知FPGA最方便實(shí)現(xiàn)的是直接型結(jié)構(gòu)FIR,實(shí)現(xiàn)時(shí)可以采用并行結(jié)構(gòu)、串行結(jié)構(gòu)、分布式結(jié)構(gòu),也可以直接使用Quartus和Vivado提供的FIR IP核。本篇先介紹并行FIR濾波器的Verilog設(shè)計(jì)。設(shè)計(jì)參考自杜勇老師的《數(shù)字濾波器的MATLAB與FPGA實(shí)現(xiàn)》。本設(shè)計(jì)將在Vivado環(huán)境下進(jìn)行仿真。
使用MATLAB設(shè)計(jì)一個(gè)2kHz采樣,500Hz截止的15階低通濾波器(h(n)長(zhǎng)度為16),量化位數(shù)為12bit,輸入信號(hào)位寬也為12bit。Verilog設(shè)計(jì)代碼如下。
模塊接口:
module Xilinx_FIR_Guide_liuqi
(
input rst, //復(fù)位信號(hào),高電平有效
input clk, //FPGA系統(tǒng)時(shí)鐘,頻率為2kHz
input signed [11:0] Xin, //數(shù)據(jù)輸入頻率為2khZ
output signed [28:0]Yout //濾波后的輸出數(shù)據(jù)
);
輸出信號(hào)的29bit位寬是全分辨率輸出,沒(méi)有截位?!安⑿小盕IR指的是多個(gè)乘法器并行地進(jìn)行濾波器系數(shù)與輸入數(shù)據(jù)之間的乘法計(jì)算,因此代碼中我們需要緩存16個(gè)數(shù)據(jù):
reg signed[11:0] Xin_Reg[15:0]; //[11:0]指單數(shù)據(jù)12bit位寬;[15:0]指共有16個(gè)數(shù)據(jù)
reg [3:0] i,j;
always @(posedge clk or posedge rst)
if (rst)
//初始化寄存器值為0
begin
for (i=0; i<15; i=i+1)
Xin_Reg[i]=12'd0;
end
else
begin
for (j=0; j<15; j=j+1)? //每個(gè)時(shí)鐘移位一個(gè)數(shù)據(jù)
Xin_Reg[j+1] <= Xin_Reg[j];
Xin_Reg[0] <= Xin;
end
由FIR系數(shù)的對(duì)稱(chēng)性可知,16個(gè)系數(shù)只需要8個(gè)乘法器即可,因此應(yīng)該將對(duì)稱(chēng)系數(shù)多對(duì)應(yīng)的輸入數(shù)據(jù)相加:
reg signed [12:0] Add_Reg[7:0];
always @(posedge clk or posedge rst)
if (rst)
//初始化寄存器值為0
begin
for (i=0; i<8; i=i+1)
Add_Reg[i]=13'd0;
end
else
begin
for (i=0; i<8; i=i+1)? ?//對(duì)稱(chēng)系數(shù)相加
Add_Reg[i]={Xin_Reg[i][11],Xin_Reg[i]}+{Xin_Reg[15-i][11],Xin_Reg[15-i]};
end
由于加法會(huì)增加一個(gè)bit位寬,因此相加結(jié)構(gòu)擴(kuò)充為13bit。由于輸入數(shù)據(jù)為二進(jìn)制補(bǔ)碼帶符號(hào)數(shù),因此在相加前需要先使用Verilog中的拼接運(yùn)算符{}擴(kuò)展符號(hào)位到最高位。接下來(lái)例化8個(gè)乘法器IP核進(jìn)行乘法運(yùn)算:
wire signed [11:0] coe[7:0] ; //濾波器為12比特量化數(shù)據(jù)
wire signed [24:0] Mout[7:0]; //乘法器輸出為25比特?cái)?shù)據(jù)
assign coe[0]=12'h000;
assign coe[1]=12'hffd;
assign coe[2]=12'h00f;
assign coe[3]=12'h02e;
assign coe[4]=12'hf8b;
assign coe[5]=12'hef9;
assign coe[6]=12'h24e;
assign coe[7]=12'h7ff;
mult_gen_0Umult0 (
.CLK (clk),
.A (coe[0]),
.B (Add_Reg[0]),
.P (Mout[0]));
mult_gen_0Umult1 (
.CLK (clk),
.A (coe[1]),
.B (Add_Reg[1]),
.P (Mout[1]));
mult_gen_0Umult2 (
.CLK (clk),
.A (coe[2]),
.B (Add_Reg[2]),
.P (Mout[2]));
mult_gen_0Umult3 (
.CLK (clk),
.A (coe[3]),
.B (Add_Reg[3]),
.P (Mout[3]));
mult_gen_0Umult4 (
.CLK (clk),
.A (coe[4]),
.B (Add_Reg[4]),
.P (Mout[4]));
mult_gen_0Umult5 (
.CLK (clk),
.A (coe[5]),
.B (Add_Reg[5]),
.P (Mout[5]));
mult_gen_0Umult6 (
.CLK (clk),
.A (coe[6]),
.B (Add_Reg[6]),
.P (Mout[6]));
mult_gen_0Umult7 (
.CLK (clk),
.A (coe[7]),
.B (Add_Reg[7]),
.P (Mout[7]));
12bit的濾波器系數(shù)與13bit的輸入信號(hào)數(shù)據(jù)相乘結(jié)果為25bit。乘法結(jié)果累加即為濾波器的輸出結(jié)果:
reg signed [28:0] sum;
reg signed [28:0] yout;
reg [3:0] k;
always @(posedge clk or posedge rst)
if (rst)
begin
sum = 29'd0;
yout <= 29'd0;
end
else
begin
yout <= sum;
sum = 29'd0;
for (k=0; k<8; k=k+1)
sum = sum+Mout[k]; //相加輸出結(jié)果
end
assign Yout = yout;
8個(gè)25bit的數(shù)相加,結(jié)果可能擴(kuò)展到29bit,這也是全分辨率輸出的結(jié)果??梢钥吹讲⑿薪Y(jié)構(gòu)的FIR乘法、加法運(yùn)算都是在一個(gè)時(shí)鐘內(nèi)完成,因此每個(gè)時(shí)鐘都能獲得一個(gè)輸出。
仿真與工程下載
使用MATLAB生成一個(gè)200Hz+800Hz的混合頻率信號(hào),寫(xiě)入txt文件,再生成一個(gè)噪聲信號(hào)寫(xiě)入txt文件。
對(duì)正弦信號(hào)的濾波如下圖所示:
明顯看到經(jīng)過(guò)500Hz低通濾波器濾波后,輸入的200Hz+800Hz信號(hào)只剩下200Hz的頻率分量。
對(duì)噪聲信號(hào)的濾波如下圖所示:
可以看到噪聲經(jīng)過(guò)濾波后的頻率分布情況明顯少于濾波前
原文標(biāo)題:FPGA-學(xué)習(xí)并行FIR濾波器Verilog設(shè)計(jì)
文章出處:【微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602986 -
數(shù)字濾波器
+關(guān)注
關(guān)注
4文章
270瀏覽量
47016 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110074 -
fir濾波器
+關(guān)注
關(guān)注
1文章
95瀏覽量
19037
原文標(biāo)題:FPGA-學(xué)習(xí)并行FIR濾波器Verilog設(shè)計(jì)
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論