前言本文根据fir滤波器相关原理进行设计构建工程,利用前文的工程构建的混频功能的工程,将高频分量进行滤除,保留低频分量。
有限冲击响应滤波器概述fir滤波器广泛应用于数字信号处理中,主要功能就是将不感兴趣的信号滤除,留下有用信号。fir滤波器是全零点结构,系统永远稳定;并且具有线性相位的特征,在有效频率范围内所有信号相位上不失真。相比iir滤波器,fir滤波器更容易用数字域进行实现。
在数字滤波的应用中, 绝大部分接触的都是使用 fir filter,其相对于 iir filter 要简单的多。fir filter 的核心思想就是卷积运算,然后了解一下卷积的时域卷积定理,就可以想象出 fir 滤波器的原理。
卷积类比fir卷积在离散数字信号领域, 卷积的定义如下
而 fir filter 中的卷积是有限长序列的卷积, 定义为
其中ℎ(k)是滤波器序列, m 是滤波器系数的长度, k 的取值为 0~m-1。在实际的应用中,一般都会认为x(n)的也是从零开始。下面举一个例子,设置一个序列和一个滤波器系数,然后观察卷积效果。
xn=[5,11,15,234,34,67,88,46,66,12];%定义x(n)序列m=size(xn,2);t1=0:m-1;%定义时间hn=[0.2,0.2,0.2,0.2,0.2];%定义h(n)序列n=size(hn,2);t2=0:n-1;yn=conv(xn,hn);t3=0:(n+m-1)-1;%卷积计算后序列的长度定义为n+m-1figure;subplot(3,1,1);stem(t1,xn,'r','filled');title('x(n)序列');%画x(n)序列subplot(3,1,2);stem(t2,hn,'g','filled');title('h(n)序列');%画h(n)序列subplot(3,1,3);stem(t3,yn,'b','filled');title('y(n)序列');%画y(n)序列经过卷积运算后的信号序列更加平滑,观察hn序列中的系数均为0.2,该设计类似一个平滑滤波器的功能,相当于做了平均滤波。
利用matlab或filter_solution设计滤波器dds的混频工程,混频之后的信号是 1mhz 和 7mhz,保留低频分量的话就要滤除 7mhz 保留 1mhz。 因为ip中设置的信号动态范围是 45db, 那么1mhz 和 7mhz 的动态范围各自是22.5db,要想把7mhz 抑制掉,需要至少滤波器要抑制信号 22.5db。 所以设计的滤波器,在 9mhz位置需要是有至少-22.5db 的衰减, 且在1mhz 位置通带尽量平滑, 并接近于 0db,也就是没有增益没有衰减。
在这里可以利用matlab的滤波器设计工具或者filter_solution进行构建。
matlab的fda设计下图为滤波器设计的界面,通过界面可以设计所需要的滤波器,为了滤除设计中的高频分量,这里使用了低通滤波,并根据实际的应用需求将参数进行设置。
滤波类型(filter type)= lowpass采样率(fs) = 50mhz滤波阶数(order) = 63(阶数越大,滤波品质越好,但相对滞后越大)密度因子( density factor)= 20fpass(通频带)= 2mhzfstop(截止带)= 4mhzapass(通频带宽增益期望)= 1dbastop(截止带宽增益期望)= -80db
完成滤波器的参数配置后,进行生成滤波器的系数,点击下图指示可生成coe文件或者c的头文件,可根据具体需要进行输出设置。
filter_solution设计滤波器该软件效果和matlab的滤波器的效果相当,都是根据需求调整相应的滤波器参数,然后进行生成相关的滤波器系数。
点击频率响应可观察到该滤波器的频率响应图。
如下图所示:
点击分析滤波器可获得相关滤波器的权值。可根据具体需求选择输出向量模式或者生成相关测试c代码。
使用fir ip进行工程设计将dds应用实例的工程进行复制备份,然后添加fir ip。打开设置相关参数。
fir滤波器ip设置可先在第一个界面配置滤波器的基本参数,如果滤波器系数选择向量格式,可将刚刚在滤波器设计软件中的系数进行复制,并粘贴到vector的输入框中。这里将之前生成的系数进行复制。
8.05e-04, 8.416e-04, 8.681e-04, 8.624e-04, 7.882e-04, 6.001e-04, 2.496e-04, -3.048e-04, -1.089e-03, -2.101e-03, -3.306e-03, -4.628e-03, -5.95e-03, -7.117e-03, -7.941e-03, -8.217e-03, -7.735e-03, -6.301e-03, -3.758e-03, 0, 5.008e-03, 1.122e-02, 1.85e-02, 2.664e-02, 3.533e-02, 4.421e-02, 5.289e-02, 6.095e-02, 6.798e-02, 7.361e-02, 7.754e-02, 7.956e-02, 7.956e-02, 7.754e-02, 7.361e-02, 6.798e-02, 6.095e-02, 5.289e-02, 4.421e-02, 3.533e-02, 2.664e-02, 1.85e-02, 1.122e-02, 5.008e-03, 0, -3.758e-03, -6.301e-03, -7.735e-03, -8.217e-03, -7.941e-03, -7.117e-03, -5.95e-03, -4.628e-03, -3.306e-03, -2.101e-03, -1.089e-03, -3.048e-04, 2.496e-04, 6.001e-04, 7.882e-04, 8.624e-04, 8.681e-04, 8.416e-04, 8.05e-04
然后可以对通道相关参数进行设置。
在第三个界面中可设置滤波器系数的相关数据格式,以及输入输出的数据格式。需要注意的是,这里输入的信号是dds产生的数据,这个数据仅有整数部分,所以要调整输入数据的小数位为0。
详细实现界面主要对滤波器的硬件实现的架构进行选择,包括对架构的优化方式,存储以及dsp资源的使用设置。
接口界面主要对相关的指示信号进行设置,这里可暂时保持默认,实际应用时可根据需要进行使能相关信号。
总结界面对前面的相关设置进行了小结展示,方便用户进行检查核对并修改错误设置的参数。
同时在左侧栏中可以看到滤波器的频率响应,以及该ip设置的相关资源使用情况,以便于在实际工程应用中对数据链路的信号进行操作处理,以及对资源的合理分配。
修改dds ip之前进行混频设计时,使用了dds的ip输出三路信号分别为10mhz,3mhz和4mhz。这里为了减少一路输出,设置两路的信号输出,匹配fir的ip采样频率的50mhz。或者这里采用频率直接修改为33.33mhz也可以。
修改顶层文件修改了dds ip后,要对逻辑进行调整使得可根据m_axis_data_tuser信号输出3m和4m的信号。并在顶层模块中调用例化fir的ip,将混频后的数据接入到fir的输入数据端,将dds的data_tvalid接到fir ip的tvalid端口,tready可悬空。因为仿真设计的是100mhz时钟,而fir ip需要的是50mhz所以用寄存器生成一个二分频时钟接入到fir ip的时钟端口。
module top( input clk ); // wire m_axis_data_tvalid_ch1; // wire [7:0] m_axis_data_tdata_ch1; // //单通道测试 // dds_compiler_0 ch1_dds( // .aclk(clk), // input wire aclk // .m_axis_data_tvalid(m_axis_data_tvalid_ch1), // output wire m_axis_data_tvalid // .m_axis_data_tdata(m_axis_data_tdata_ch1) // output wire [7 : 0] m_axis_data_tdata // ); wire m_axis_data_tvalid_ch3; wire [7 : 0] m_axis_data_tdata_ch3; wire [0 : 0] m_axis_data_tuser_ch3; // wire m_axis_phase_tvalid_ch3; // wire [31 : 0] m_axis_phase_tdata_ch3; // wire [1 : 0] m_axis_phase_tuser_ch3; //多通道测试 dds_compiler_1 multi_ch_dds( .aclk(clk), // input wire aclk .m_axis_data_tvalid (m_axis_data_tvalid_ch3), // output wire m_axis_data_tvalid .m_axis_data_tdata (m_axis_data_tdata_ch3), // output wire [7 : 0] m_axis_data_tdata .m_axis_data_tuser (m_axis_data_tuser_ch3), // output wire [1 : 0] m_axis_data_tuser .m_axis_phase_tvalid(), // output wire m_axis_phase_tvalid .m_axis_phase_tdata (), // output wire [31 : 0] m_axis_phase_tdata .m_axis_phase_tuser () // output wire [1 : 0] m_axis_phase_tuser ); reg [7 : 0] data10mhz; reg [7 : 0] data3mhz; reg [7 : 0] data4mhz; always @(posedge clk) begin case(m_axis_data_tuser_ch3) 0:data3mhz<=m_axis_data_tdata_ch3; 1:data4mhz<=m_axis_data_tdata_ch3; endcase end //混频测试 wire [15 : 0] mixer_singal; mult_gen_0 mult_mixer ( .clk(clk), // input wire clk .a(data3mhz), // input wire [7 : 0] a .b(data4mhz), // input wire [7 : 0] b .p(mixer_singal) // output wire [15 : 0] p ); wire [39:0] after_fir_singal; reg div_clk=0; always @(posedge clk ) begin div_clk<=!div_clk; end fir_compiler_0 uut_fir( .aclk(div_clk), // input wire aclk .s_axis_data_tvalid(m_axis_data_tvalid_ch3), // input wire s_axis_data_tvalid .s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready .s_axis_data_tdata(mixer_singal), // input wire [15 : 0] s_axis_data_tdata .m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid .m_axis_data_tdata(after_fir_singal) // output wire [39 : 0] m_axis_data_tdata );endmodule运行仿真测试点击运行行为级仿真,添加信号波形,并修改信号的进制(进制可选择有符号十进制)和类型(选择模拟类型),可观察到下面的情况。
从截图中可看出,混频后的信号经过了滤波处理消除了高频分量,添加游标可观察滤波后的信号的频率。添加游标后观察发现滤波后的信号为混频信号的1mhz的信号。因此,工程设计中的低通滤波很好地滤除掉了7mhz的高频分量。
小结思考在使用fir滤波器中的实际设计的数字滤波器效果可能会因设置的不同而效果不同。因此,在实际使用时要关注一下方面确保滤波器的效果能达到预期。
在滤波器工具使用时应考虑不同类型的滤波器的实际效果,可经过对比选择性能较优异,阶数少,且滤波效果能达到使用预期的类型,例如在使用fir滤波器时,同样阶数的不同类型窗的滤波效果可能对特定信号的滤波效果不同。该工程仅仅验证了fir滤波器的基本功能,在实际使用时特别是遇到实时处理的情况需谨慎考虑滤波器的并行度,确保在规定的处理时间内能完成相关信号处理操作,且要关注数据链路的数据位宽,确保在实际应用做切片处理时不会损失精度,或造成数据溢出。
光伏项目—如何正确使用“铝合金”电缆
国家能源局发布蔚来研究制定的换电行业标准
安全是一个家庭赖以生存和发展的基础,安防或将成为智能家居的突破口
移动设备/车联网拉抬需求,智能传感器商机爆发
手表的等级分类标准
数字信号处理-FIR IP应用实例
linux怎么安装tools
华为荣耀V9更新EMUI5.1 这个功能小米魅族早就有了
基于金属纳米线非共线自旋计算
vivo X60系列全渠道正式开售
腾讯公布移动机器人领域新进展
华为5G技术获得新认可,中东国家在其5G部署中使用华为设备
BK3633,ble5.2蓝牙soc双模芯片应用参数
iReaderSmart智能本评测 它与纸质书的区别可能只差了油墨香
人工智能是否会取代人类 关于人工智能的思考
动力电池高镍化趋势之下,氢氧化锂市场需求超出预期
基于STM32F103C8T6单片机的三路硬件设计
小米再次申请雷军签名图形商标
华为科普5G双模手机 双卡双待+NSA/SA双模
日本伊藤忠商事宣布与比亚迪建立合资企业 欲将汽车电池重新利用