【HB filter】基于FPGA的半带滤波器(HB) 的设计
1.软件版本
Quartusii12.1
2.本算法理论知识
HBF模块由半带滤波器(HBF)和抽取模块组成。该模块的任务是实现2倍抽取进一步降低信号采样速率。由于HBF的冲激响应h(k)除零点外其余偶数点均为零,所以用HBF实现2倍抽取可以节省一半的运算量,对增强软件无线电的实时性非常重要,HBF还具有参数约束少,设计容易、方便的特点。半带滤波器的主要作用是滤除信号高频部分,防止抽取过程后信号发生频谱混叠。
在实际中,需要将输入信号进行多次滤波和抽取,并逐次降低采样率,同时也降低对每一级抗混叠滤波器的要求,所以需要使用半带滤波器进行设计与实现。
阻带衰减: ≥50dB
通带不平坦度:≤2dB
通常情况下,半带滤波器的有三种基本的结构,一般结构,转置结构以及复用结构,下面我们将针对这三种结构的滤波效果以及硬件占用情况进行分析,从而选用最佳的设计方案。
★半带滤波器的系数确定
通常情况下,半带滤波器的频谱特性如图1所示:
频谱对称性的特点使得半带滤波器的时域冲击响应除极值点以外,在其余所有偶数点都为零,利用该性质,可以将运算量降低一半。
本系统,我们将设计的滤波器,首先,我们可以使用和FIR滤波器设计方法相同的方法进行设计。根据的设计要求,输入的信号带宽为20M,前面设计的NCO,其载波频率为20M,所以,在进行下变频的时候,会产生两倍的频率分量,具体如下所示:
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
所以,需要设计一个滤波器,其截止频率可以设定为20M,即大于20M的全部滤除,所以,通过上式,可以将其中的高频分量滤除掉。
此外,由于你的要求中提高通带通带不平坦度≤2dB,那么通常情况下,滤波器的阶数需要设计为中高阶,这里,我们选用65阶的滤波器。
3.部分源码
在MATLAB命令行中输入FDAtool,然后显示如下的界面,进行滤波器的设计:
将通带和阻带放大,可以看到如下的结果:
可以看到,这么一个效果,通带的不平坦度和阻带的衰减基本满足设计需求。产生的滤波器系数如下所示:
其系数如下所示:
-0.00155965846190849 -0.00952583660975731 -0.0192068330061876 -0.0179259709192058 0.000712959523136487 0.0188957029356946 0.0105047070598809 -0.0188943413581846 -0.0266507867913233 0.0101837262873298 0.0460875556113994 |
0.0147245607722628 -0.0647700808685521 -0.0724069698055561 0.0782875722309085 0.306295132489419 0.416802321987223 0.306295132489419 0.0782875722309085 -0.0724069698055561 -0.0647700808685521 0.0147245607722628 0.0460875556113994 |
0.0101837262873298 -0.0266507867913233 -0.0188943413581846 0.0105047070598809 0.0188957029356946 0.000712959523136487 -0.0179259709192058 -0.0192068330061876 -0.00952583660975731 -0.00155965846190849 |
在FPGA中,需要将系数进行量化,我们乘以一个量化系数2^16。量化后的系数如下所示:
-102 -624 -1259 -1175 47 1238 688 -1238 -1747 667 3020 965 -4245 |
-4745 5131 20073 27316 20073 5131 -4745 -4245 965 3020 667 -1747 |
-1238 688 1238 47 -1175 -1259 -624 -102 |
module hb_filter_01(i_clk,i_rst,i_din,o_clk2,o_dout);parameter h16 = -102;
parameter h15 = -624;
parameter h14 = -1259;
parameter h13 = -1175;
parameter h12 = 47;
parameter h11 = 1238;
parameter h10 = 688;
parameter h9 = -1238;
parameter h8 = -1747;
parameter h7 = 667;
parameter h6 = 3020;
parameter h5 = 965;
parameter h4 = -4245;
parameter h3 = -4745;
parameter h2 = 5131;
parameter h1 = 20073;
parameter h0 = 27316;input i_clk;
input i_rst;
input signed[15:0] i_din;
output o_clk2;
output signed[31:0]o_dout;//delay 33 units
integer i;
reg signed[15:0]men_delay[33:1];
always @(posedge i_clk or posedge i_rst)
beginif(i_rst)beginfor(i=1;i<=33;i=i+1)beginmen_delay[i] <= 16'd0;endend
else beginmen_delay[1] <= i_din;for(i=2;i<=33;i=i+1)beginmen_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)
beginif(i_rst)beginfor(i=1;i<=33;i=i+1)beginreg_adder01[i] <= 32'd0;endend
else beginreg_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)
beginif(i_rst)beginfor(i=1;i<=9;i=i+1)beginreg_adder02[i] <= 32'd0;endend
else beginreg_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)
beginif(i_rst)beginfor(i=1;i<=5;i=i+1)beginreg_adder03[i] <= 32'd0;endend
else beginreg_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)
beginif(i_rst)beginfor(i=1;i<=3;i=i+1)beginreg_adder04[i] <= 32'd0;endend
else beginreg_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)
beginif(i_rst)beginr_dout <= 32'd0; end
else beginr_dout <= reg_adder04[1] + reg_adder04[2] + reg_adder04[3];end
endreg[3:0]cnt = 4'b00000;
always @(posedge i_clk or posedge i_rst)
beginif(i_rst)begincnt <= 4'b0000;end
else begincnt <= cnt + 4'b0001;end
endassign o_clk2 = cnt[0];always @(posedge o_clk2 or posedge i_rst)
beginif(i_rst)begino_dout <= 32'd0; end
else begino_dout <= r_dout;end
endendmodule
4.仿真分析
该模块的硬件占用资源为:
其仿真结果如下所示:
A01-115
【HB filter】基于FPGA的半带滤波器(HB) 的设计相关推荐
- m基于FPGA的多级抽取滤波器组verilog设计,包括CIC滤波,HB半带滤波以及DA分布式FIR滤波
目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 数字下变频中的低通滤波器是由多级抽取滤波器组实现的.信号的同相分量和正交分量再分别经由积分梳状滤波器( ...
- 【 FPGA 】半带 FIR 滤波器(Half-band FIR Filter)
先给出半带 FIR滤波器的一般频率响应: 幅度频率响应关于四分之一采样频率π/ 2弧度对称.采样率归一化为 2π radians/sec,通带与阻带频率的关系为: 通带与阻带波纹相等,这些特征反映在滤 ...
- 【FPGA】fir滤波器-半带滤波器
文章目录 1. 半带滤波器的定义 2 半带滤波器的用法示例 1. 半带滤波器的定义 半带滤波器是一种特殊的FIR滤波器,其阶数只能为偶数,长度为奇数(N阶滤波器,N+1个抽头).滤波器系数除了 ...
- matlab 滤波器设计 coe_一种半带滤波器的低功耗实现方法
在如今数字技术中,半带滤波器因其通带阻带对称,系数具有偶对称性且滤波器阶数为奇数,有效系数少等特点广泛应用于通信.视频处理.语音识别等数字信号处理应用中,尤其常用于实现信号的2倍抽取.对于一个阶数为N ...
- 如何利用CIC滤波器、CIC补偿滤波器和半带滤波器设计一个高频数字抽取滤波器
设计了采样频率为640 MHz.过采样率为64的高频数字抽取滤波器.该数字抽取滤波器由CIC(Cascaded Integrator Comb)滤波器(降16倍).CIC补偿滤波器(降2倍)和半带滤波 ...
- CICl滤波器(含补偿滤波器)半带滤波器 ——数字滤波器
一.数字滤波器原理: 数字抽取滤波器是ΣΔADC(ΣΔAnolog-to-Digital Converter)的重要组成部为分,旨在从高速.低分辨率的调制信号中重构出高分辨率.奈奎斯特频率的信号.为节 ...
- 抽取_内插_半带滤波器_多相滤波器
文章目录 半带滤波器 多相抽取滤波器 多相内插滤波器 半带抽取器和半带内插器 参考资料:Xilinx FIR Compiler v7.2 LogiCORE IP Product Guide PG149 ...
- 基于FPGA的多级CIC滤波器实现四倍抽取一
在实现多级CIC滤波器前我们先来了解滑动平均滤波器.微分器.积分器以及梳状滤波器原理.CIC滤波器在通信信号处理中有着重要的应用. 1滑动平均滤波器 图1 8权值滑动平均滤波器结构 滑动平均滤波器(M ...
- 基于FPGA的多级CIC滤波器实现四倍抽取一(5)
基于FPGA的多级CIC滤波器实现四倍抽取一 在实现多级CIC滤波器前我们先来了解滑动平均滤波器.微分器.积分器以及梳状滤波器原理.CIC滤波器在通信信号处理中有着重要的应用. 1滑动平均滤波器 图1 ...
最新文章
- 【Linux】【通信】1.ping不通
- app爬虫Android 7证书设置
- 聚类算法——Birch详解
- 根据当前日期返回星期数
- java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)...
- 计算机科学与技术 课表 武汉,欢迎访问武汉理工大学计算机科学与技术学院
- AE Pixel Sorter 2 for Mac破解教程
- echarts绘制分时图(2)-- 配置echarts
- 对计算机科学的认识论文,关于对计算机的认识论文
- android 测光模式,Android摄像头:设置测光点位置
- graphpad两组t检验_GraphPad prism -- t检验操作步骤解析~
- linux开启vi命令,让Linux默认启动是字符界面和Linux之VI命令详解
- 微信android视频压缩方案,微信视频压缩怎样实现
- 锐龙7 7840U参数 r7 7840U性能怎么样 r77840U相当于什么水平
- 论微信朋友圈,巨头的解决之道
- 数据库中的五种约束及其添加方法
- 老人上网_一些老人的国家
- java 不是内部或外部命令,也不是可运行程序
- 【《Multimodal Transformer for Unaligned Multimodal Language Sequences》论文翻译】
- 抓包工具Charles--出现unknown情况解决办法