目錄
1.算法描述
2.仿真效果預覽
3.verilog核心程序
4.完整FPGA
1.算法描述
? ? ? ? HBF模塊由半帶濾波器(HBF)和抽取模塊組成。該模塊的任務是實現(xiàn)2倍抽取進一步降低信號采樣速率。由于HBF的沖激響應h(k)除零點外其余偶數(shù)點均為零,所以用HBF實現(xiàn)2倍抽取可以節(jié)省一半的運算量,對增強軟件無線電的實時性非常重要,HBF還具有參數(shù)約束少,設計容易、方便的特點。半帶濾波器的主要作用是濾除信號高頻部分,防止抽取過程后信號發(fā)生頻譜混疊。
? ? 在實際中,需要將輸入信號進行多次濾波和抽取,并逐次降低采樣率,同時也降低對每一級抗混疊濾波器的要求,所以需要使用半帶濾波器進行設計與實現(xiàn)。
阻帶衰減: ? ?≥50dB
通帶不平坦度:≤2dB
? ? ? 通常情況下,半帶濾波器的有三種基本的結構,一般結構,轉(zhuǎn)置結構以及復用結構,下面我們將針對這三種結構的濾波效果以及硬件占用情況進行分析,從而選用最佳的設計方案。
?
? ? ? ?頻譜對稱性的特點使得半帶濾波器的時域沖擊響應除極值點以外,在其余所有偶數(shù)點都為零,利用該性質(zhì),可以將運算量降低一半。
? ? ? ?本系統(tǒng),我們將設計的濾波器,首先,我們可以使用和FIR濾波器設計方法相同的方法進行設計。 根據(jù)的設計要求,輸入的信號帶寬為20M,前面設計的NCO,其載波頻率為20M,所以,在進行下變頻的時候,會產(chǎn)生兩倍的頻率分量,具體如下所示:
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
? ? ? ? 所以,需要設計一個濾波器,其截止頻率可以設定為20M,即大于20M的全部濾除,所以,通過上式,可以將其中的高頻分量濾除掉。
此外,由于你的要求中提高通帶通帶不平坦度≤2dB,那么通常情況下,濾波器的階數(shù)需要設計為中高階,這里,我們選用65階的濾波器。
★半帶濾波器的一般結構
? ? ? 普通濾波器的結構,就是一般的FIR濾波器的結構,只是系數(shù)取一般,進行半帶濾波,根據(jù)半帶濾波的表達式,
??
這個結構式最傳統(tǒng)的FIR濾波器的結構,我們首先來進行最簡單的結構設計。
然后根據(jù)半帶濾波器的性質(zhì),這里我們只需要做如下的運行進行就可以了。
★半帶濾波器的復用結構
復用結構比較簡單,其主要就是通過計數(shù)器來選擇不同時刻的h0值,然后
其相關理論知識比較簡單,下面我們將在FPGA中實現(xiàn)該算法。
那么這里,我們的濾波器系數(shù)為:
(0),(h15 = -624),(0),(h13 = -1175),(0),(h11 = 1238),(0),(h9 ?= -1238),
(0),(h7 ?= 667),(0),(h5 ?= 965),(0),(h3 ?= -4745),(0),(h1 ?= 20073),(h0 = 27316),
(h1 ?= 20073),(0),(h3 ?= -4745),(0),(h5 ?= 965),(0),(h7 ?= 667),
(0),(h9 ?= -1238),(0),(h11 = 1238),(0),(h13 = -1175),(0),(h15 = -624),(0)
通過一個計數(shù)器,來作為按鍵選擇不同時間的不同系數(shù)的選擇,這里,由于濾波器的系數(shù)由33個。即,計數(shù)器的值從0到32。而系數(shù)為非0的計數(shù)器值為
1,3,5,7,9,11,13,15,16,17,19,21,23,25,27,29,31
因此,在FPGA中,我們可以通過設計一個計數(shù)器進行乘法器的復用。
2.仿真效果預覽
版本vivado2019.2
文章來源:http://www.zghlxwxcb.cn/news/detail-400820.html
3.verilog核心程序
...........................
//delay 33 units
integer i;
reg signed[15:0]men_delay[33:1];
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
for(i=1;i<=33;i=i+1)
begin
men_delay[i] <= 16'd0;
end
end
else begin
men_delay[1] <= i_din;
for(i=2;i<=33;i=i+1)
begin
men_delay[i] <= men_delay[i-1];
end
end
end
//level 1
reg signed[31:0]reg_adder01[33:1];
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
for(i=1;i<=33;i=i+1)
begin
reg_adder01[i] <= 32'd0;
end
end
else begin
reg_adder01[1] <= 32'd0;
reg_adder01[2] <= h15 * men_delay[2];
reg_adder01[3] <= 32'd0;
reg_adder01[4] <= h13 * men_delay[4];
reg_adder01[5] <= 32'd0;
reg_adder01[6] <= h11 * men_delay[6];
reg_adder01[7] <= 32'd0;
reg_adder01[8] <= h9 * men_delay[8];
reg_adder01[9] <= 32'd0;
reg_adder01[10]<= h7 * men_delay[10];
reg_adder01[11]<= 32'd0;
reg_adder01[12]<= h5 * men_delay[12];
reg_adder01[13]<= 32'd0;
reg_adder01[14]<= h3 * men_delay[14];
reg_adder01[15]<= 32'd0;
reg_adder01[16]<= h1 * men_delay[16];
//============================================================
reg_adder01[17]<= h0 * men_delay[17];
//============================================================
reg_adder01[18]<= h1 * men_delay[18];
reg_adder01[19]<= 32'd0;
reg_adder01[20]<= h3 * men_delay[20];
reg_adder01[21]<= 32'd0;
reg_adder01[22]<= h5 * men_delay[22];
reg_adder01[23]<= 32'd0;
reg_adder01[24]<= h7 * men_delay[24];
reg_adder01[25]<= 32'd0;
reg_adder01[26]<= h9 * men_delay[26];
reg_adder01[27]<= 32'd0;
reg_adder01[28]<= h11 * men_delay[28];
reg_adder01[29]<= 32'd0;
reg_adder01[30]<= h13 * men_delay[30];
reg_adder01[31]<= 32'd0;
reg_adder01[32]<= h15 * men_delay[32];
reg_adder01[33]<= 32'd0;
end
end
//level 2
reg signed[31:0]reg_adder02[9:1];
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
for(i=1;i<=9;i=i+1)
begin
reg_adder02[i] <= 32'd0;
end
end
else begin
reg_adder02[1] <= reg_adder01[2] + reg_adder01[32];
reg_adder02[2] <= reg_adder01[4] + reg_adder01[30];
reg_adder02[3] <= reg_adder01[6] + reg_adder01[28];
reg_adder02[4] <= reg_adder01[8] + reg_adder01[26];
reg_adder02[5] <= reg_adder01[17];
reg_adder02[6] <= reg_adder01[10]+ reg_adder01[24];
reg_adder02[7] <= reg_adder01[12]+ reg_adder01[22];
reg_adder02[8] <= reg_adder01[14]+ reg_adder01[20];
reg_adder02[9] <= reg_adder01[16]+ reg_adder01[18];
end
end
//level 3
reg signed[31:0]reg_adder03[5:1];
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
for(i=1;i<=5;i=i+1)
begin
reg_adder03[i] <= 32'd0;
end
end
else begin
reg_adder03[1] <= reg_adder02[1] + reg_adder02[9];
reg_adder03[2] <= reg_adder02[2] + reg_adder02[8];
reg_adder03[3] <= reg_adder02[3] + reg_adder02[7];
reg_adder03[4] <= reg_adder02[4] + reg_adder02[6];
reg_adder03[5] <= reg_adder02[5];
end
end
//level 4
reg signed[31:0]reg_adder04[3:1];
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
for(i=1;i<=3;i=i+1)
begin
reg_adder04[i] <= 32'd0;
end
end
else begin
reg_adder04[1] <= reg_adder03[1] + reg_adder03[5];
reg_adder04[2] <= reg_adder03[2] + reg_adder03[3];
reg_adder04[3] <= reg_adder03[4];
end
end
//level 5
reg signed[31:0]r_dout = 32'd0;
reg signed[31:0]o_dout = 32'd0;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
r_dout <= 32'd0;
end
else begin
r_dout <= reg_adder04[1] + reg_adder04[2] + reg_adder04[3];
end
end
01_115m
4.完整FPGA
V文章來源地址http://www.zghlxwxcb.cn/news/detail-400820.html
到了這里,關于m基于FPGA的半帶濾波器verilog設計,對比普通結構以及乘法器復用結構的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!