数字信号处理——FIR IP应用实例

前言

        本文根据FIR滤波器相关原理进行设计构建工程,利用前文的工程构建的混频功能的工程,将高频分量进行滤除,保留低频分量。

有限冲击响应滤波器概述

        FIR滤波器广泛应用于数字信号处理中,主要功能就是将不感兴趣的信号滤除,留下有用信号。FIR滤波器是全零点结构,系统永远稳定;并且具有线性相位的特征,在有效频率范围内所有信号相位上不失真。相比IIR滤波器,FIR滤波器更容易用数字域进行实现。

        在数字滤波的应用中, 绝大部分接触的都是使用 FIR Filter,其相对于 IIR Filter 要简单的多。FIR Filter 的核心思想就是卷积运算,然后了解一下卷积的时域卷积定理,就可以想象出 FIR 滤波器的原理。

卷积类比FIR卷积

        在离散数字信号领域, 卷积的定义如下:

         而 FIR Filter 中的卷积是有限长序列的卷积, 定义为:

         其中ℎ(𝑘)是滤波器序列, M 是滤波器系数的长度, k 的取值为 0~M-1。在实际的应用中,一般都会认为𝑥(𝑛)的也是从零开始。下面举一个例子,设置一个序列和一个滤波器系数,然后观察卷积效果。

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-1
figure;
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设计

        下图为滤波器设计的界面,通过界面可以设计所需要的滤波器,为了滤除设计中的高频分量,这里使用了低通滤波,并根据实际的应用需求将参数进行设置。

  1. 滤波类型(Filter Type)= Lowpass

  2. 采样率(Fs) = 50MHZ

  3. 滤波阶数(order) = 63(阶数越大,滤波品质越好,但相对滞后越大)

  4. 密度因子( Density Factor)= 20

  5. Fpass(通频带)= 2MHZ

  6. Fstop(截止带)= 4MHZ

  7. Apass(通频带宽增益期望)= 1dB

  8. Astop(截止带宽增益期望)= -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滤波器中的实际设计的数字滤波器效果可能会因设置的不同而效果不同。因此,在实际使用时要关注一下方面确保滤波器的效果能达到预期。

  1. 在滤波器工具使用时应考虑不同类型的滤波器的实际效果,可经过对比选择性能较优异,阶数少,且滤波效果能达到使用预期的类型,例如在使用FIR滤波器时,同样阶数的不同类型窗的滤波效果可能对特定信号的滤波效果不同。

  2. 该工程仅仅验证了FIR滤波器的基本功能,在实际使用时特别是遇到实时处理的情况需谨慎考虑滤波器的并行度,确保在规定的处理时间内能完成相关信号处理操作,且要关注数据链路的数据位宽,确保在实际应用做切片处理时不会损失精度,或造成数据溢出。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python数字信号处理应用pdf超清完整版是一本实用的电子书。本书详细介绍了如何使用Python编程语言进行数字信号处理,其中包括数字滤波、时域分析和频域分析等多个方面,同时还介绍了一些实现数字信号处理的工具包和库,如NumPy、SciPy和Matplotlib等。 数字信号处理是一种非常重要的技术,它在许多领域应用广泛,包括通信、医学、音频和图像处理等。Python是一种流行的编程语言,它具有易学易用、开源和强大的数学计算和科学计算支持的特点,因此在数字信号处理领域也被广泛使用。 本书适合有一定编程基础的读者,其中许多例子和代码都可以帮助读者更好地理解数字信号处理的原理和实现方法。同时,本书的超清完整版,也保证了读者可以高清清晰地查看书中的图表和代码,从而更好地学习数字信号处理的知识。 总之,Python数字信号处理应用pdf超清完整版是一本值得推荐的电子书,它可以帮助读者更好地掌握数字信号处理技术,同时还能够通过使用Python编程实现数字信号处理应用。 ### 回答2: Python数字信号处理应用的PDF超清完整版是指一份详细介绍如何使用Python进行数字信号处理的电子书。数字信号处理是指对信号进行采样、量化、滤波、变换和编码等操作,以求得出信号的相关信息。Python是一种高级编程语言,拥有丰富的数据处理库和良好的扩展性,因此在数字信号处理方面也表现出色。 该PDF电子书详细介绍了信号处理的基础知识,包括采样定理、功率谱密度、数字滤波、离散傅里叶变换(DFT)、快速傅里叶变换(FFT)等。同时,它还列举了许多数字信号处理应用案例,如音频处理、图像处理、神经网络等。 本书的适用对象主要为数字信号处理领域的工程师和研究人员,但对于那些对数字信号处理感兴趣的学生和爱好者也会有很大的帮助。通过本书的学习,读者能够掌握Python在数字信号处理领域的运用,并将其应用于实际工作和研究中。 总之,Python数字信号处理应用的PDF超清完整版,是一份详细介绍数字信号处理知识和Python编程实现的电子书,对于数字信号处理领域的人员及学习爱好者都是一份非常实用的学习资料。 ### 回答3: Python数字信号处理应用PDF超清完整版,是一本关于Python在数字信号处理方面的应用指南。本书主要介绍了Python中的数字信号处理的基本概念、原理、方法和应用实例。该书共包括8个章节。 第一章主要介绍了Python语言的基本知识和数字信号处理的相关概念。通过本章的学习,读者可以了解到Python作为一种高级语言具有的优势、数字信号处理的定义及其应用。 第二章主要介绍了数字信号处理的基本算法和工具。包括离散傅里叶变换、滤波器设计等内容。此章对于初学者来说,是一个很好的入门教程,也是接下来章节的基础。 第三章主要介绍了信号采样、量化和编码。涉及到数字量化和编码的基本原理及应用。 第四章主要介绍了数字信号的滤波。包括FIR和IIR滤波器设计滤波器参数的选择等内容。读者可以了解到如何使用Python进行滤波器设计和实现。 第五章主要介绍了时间频域分析和谱估计。包括经典的自相关、互相关分析、经验模态分解(EMD)等内容。该章内容涉及到频域分析很多不同的方法,非常丰富。 第六章主要介绍了数字滤波器信号处理中的应用,包括语音信号增强、图像处理、通信等方面的应用。 第七章主要介绍了噪声分析和信号处理中的信号分析。本章介绍了如何使用Python进行噪声分析和信号分析,并且附有实例。 第八章提供了一些关于数字信号处理的研究方向和应用案例,包括生物医学信号处理、机器学习中的数字信号处理、嵌入式系统中的数字信号处理等。 总之,该书详细介绍了Python数字信号处理的基础和进阶内容,包含大量实例应用案例,为读者提供了全面的学习指南。无论是初学者还是进阶者,都可以在本书中获得知识和启发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值