【电赛仪器仪表】基于MATLAB的数字滤波器设计与ARM官方DSP库的结合

主要内容

  • Ⅰ. 数字滤波器基础知识
  • 1.数字滤波器的概念
  • 2.数字滤波器的分类
  • 3.数字滤波器的技术指标
  • Ⅱ.使用MATLAB软件设计两类数字滤波器
  • 1.FIR滤波器
  • 1)窗函数简介
  • 2)filterDesigner使用
  • 2.IIR滤波器
  • Ⅲ.数字滤波器与官方DSP库结合使用
  • 1.DSP库的安装使用
  • 2.DSP库滤波器函数介绍
  • 1)FIR滤波器
  • 函数 arm_fir_init_f32
  • 函数 arm_fir_f32
  • 2)IIR滤波器
  • 函数 arm_biquad_cascade_df1_init_f32
  • 函数 arm_biquad_cascade_df1_f32
  • 3.滤波器具体使用示例
  • 1)FIR滤波器与DSP库结合使用
  • 2)IIR滤波器与DSP库结合使用
  • Ⅳ.总结
  • 理论高度决定实践高度
  • Ⅰ. 数字滤波器基础知识

    1.数字滤波器的概念

  • 数字滤波器是对数字信号进行滤波处理以得到期望的响应特性的离散时间系统。作为一种电子滤波器,数字滤波器与完全工作在模拟信号域的模拟滤波器不同。数字滤波器工作在数字信号域,它处理的对象是经由采样器 件将模拟信号转换而得到的数字信号。
  • 简单而言,数字滤波器是一类对数字信号进行运算和处理,并且输出也是数字信号的系统。
  • 2.数字滤波器的分类

  • 从功能上分;低通、带通、高通、带阻
  • 从实现方法上分:FIR、IIR
  • 从设计方法上来分:Chebyshev(切比雪夫),Butterworth(巴特沃斯)
  • 从处理信号分:经典滤波器、现代滤波器
  • 3.数字滤波器的技术指标

  • ωp:通带截止频率
  • αp:通带允许的最大衰减
  • ωs:阻带截止频率
  • αs:阻带允许的最小衰减
  • ωc:3dB 通带截止频率
  • δ1 δ2:通带、阻带的容限(允许误差)
  • αp = 20 log |H(e jo)| |H(e jωp)| = −20 log|H(e jωp )|(dB)
  • αs = 20 log |H(e jo)| |H(e jωs)| = −20 log|H(e jωs )|(dB)
  • 式中均假定H(e jo) = 1 (归一化) 当ωp = ωc时,αp = 3dB
    数字滤波器系统函数
  • Ⅱ.使用MATLAB软件设计两类数字滤波器

    1.FIR滤波器

    1)窗函数简介

    在数字信号处理领域,往往需要将信号进行截断处理,截断所使用的即为窗函数。窗函数的本质是对信号进行加权。由于离散系统的特性,所得信号会不可避免地出现频谱泄漏以及栅栏效应,窗函数的作用是为了抑制这两种现象。以下是一些主要窗函数的比较:

    优点 缺点
    Rectangle 频率分辨率最好 幅度准确度最差
    Hanning 频率分辨率较好 幅度准确度较差
    Hamming 幅度准确度较好 频率分辨率较差
    Blackman 幅度准确度最好 频率分辨率最差

    2)filterDesigner使用

  • 在Matlab命令行窗口输入‘filterDesigner’,调用滤波器设计组件。设计好FIR滤波器的类型,设计方法,阶数,截止频率等参数后点击Design Filter 按钮就生成了所需的滤波器系数:
  • FIR滤波器设计
    ,生成滤波器系数以后点击 filterDesigner界面上的菜单 Targets->Generate C header ,打开后显示如下界面:
    参数导出
    点击Generate,选择保存路径后即可完成导出参数。关于参数的使用则在下一部分。

    2.IIR滤波器

  • IIR滤波器的设计与FIR相似,但在导出参数时需要注意一些细节:

  • 默认生成的 IIR 滤波器类型是 Direct-Form II, Second-Order Sections(直接 II 型,每个
    Section 是一个 二阶滤波器)。这里我们需要将其转换成Direct-Form I, Second-Order
    Sections,因为本章使用的IIR滤波器函数是Direct-Form I的结构。 转换方法:点击 Edit->Convert
    Structure,界面如下,这里我们选择第一项,并点击 OK:
    转换结构

  • 转换好以后再点击 File-Export,第一项选择 Coefficient File(ASCII):
    选择导出类型

  • 第一项选择好以后,第二项选择 Decimal:
    选择导出类型

  • 两个选项都选择好以后,点击 Export 进行导出,导出后保存即可。

  • 由于Matlab设计IIR所使用的公式与DSP库函数中有所不同,故需对系数的处理:去掉每行的a0,并把a1,a2取反。经过处理后的系数才可与DSP库结合使用:
    IIR系数处理

  • Ⅲ.数字滤波器与官方DSP库结合使用

    1.DSP库的安装使用

  • DSP库是电赛常用到的一个库,安装方法推荐以下教程:DSP库快速添加
  • 使用教程推荐官方网站:DSP库教程
  • 2.DSP库滤波器函数介绍

    1)FIR滤波器

    函数 arm_fir_init_f32

  • 函数原型:
  • void arm_fir_init_f32(
     arm_fir_instance_f32 * S,
     uint16_t numTaps,
     const float32_t * pCoeffs,
     float32_t * pState,
     uint32_t blockSize);
    
  • 函数描述:
    这个函数用于 FIR 初始化。
  • 函数参数:
    ◆ 第 1 个参数是 arm_fir_instance_f32 类型结构体变量。
    ◆ 第 2 个参数是滤波器系数的个数。
    ◆ 第 3 个参数是滤波器系数地址。
    ◆ 第 4 个参数是缓冲状态地址。
  • 函数 arm_fir_f32

  • 函数原型:
  • void arm_fir_f32(
    const arm_fir_instance_f32 * S,
    const float32_t * pSrc,
    float32_t * pDst,
    uint32_t blockSize);
    
  • 函数描述:
    这个函数用于 FIR 滤波。
  • 函数参数:
    ◆ 第 1 个参数是 arm_fir_instance_f32 类型结构体变量。
    ◆ 第 2 个参数是源数据地址。
    ◆ 第 3 个参数是滤波后的数据地址。
    ◆ 第 4 个参数是每次调用处理的数据个数,最小可以每次处理 1 个数据,最大可以每次全部处理完。
  • 2)IIR滤波器

    函数 arm_biquad_cascade_df1_init_f32

  • 函数原型:
  • void arm_biquad_cascade_df1_init_f32(
     arm_biquad_casd_df1_inst_f32 * S,
     uint8_t numStages,
     const float32_t * pCoeffs,
     float32_t * pState);
    
  • 函数描述:
    这个函数用于 IIR 初始化。
  • 函数参数:
    ◆ 第 1 个参数是 arm_biquad_casd_df1_inst_f32 类型结构体变量。
    ◆ 第 2 个参数是 2 阶滤波器的个数。
    ◆ 第 3 个参数是滤波器系数地址。
    ◆ 第 4 个参数是缓冲状态地址。
  • 函数 arm_biquad_cascade_df1_f32

  • 函数原型:
  •  void arm_biquad_cascade_df1_f32(
     const arm_biquad_casd_df1_inst_f32 * S,
     float32_t * pSrc,
     float32_t * pDst,
     uint32_t blockSize);
    
  • 函数描述:
    这个函数用于 IIR 滤波。
  • 函数参数:
    ◆ 第 1 个参数是 arm_biquad_casd_df1_inst_f32 类型结构体变量。
    ◆ 第 2 个参数是源数据地址。
    ◆ 第 3 个参数是滤波后的数据地址。
    ◆ 第 4 个参数是每次调用处理的数据个数,最小可以每次处理 1 个数据,最大可以每次全部处理完。
  • 3.滤波器具体使用示例

    1)FIR滤波器与DSP库结合使用

    我们只需要调用DSP库的函数,将已经设计好的系数作为参数传入函数当中,即可实现在STM32平台上的滤波:

    /*  FIR滤波器  */
    static float FIR_State[BLOCK_SIZE+FIR_ORDER] ;   //FIR滤波器状态缓存
    static arm_fir_instance_f32 FIR_Sta; //定义结构体S
    void calc_FIR(float *input,u16 w) //可控制截止频率的FIR
    {
        arm_fir_init_f32(&FIR_Sta, FIR_LEN, (float*)LowPassFIR[w-1], FIR_State, BLOCK_SIZE); //初始化结构体
        for(u16 i=0;i<NUMBLOCKS;i++)
        {
            arm_fir_f32(&FIR_Sta, input + (i * BLOCK_SIZE), input + (i * BLOCK_SIZE),BLOCK_SIZE);
        }
    }
    void FIR_calc(float *input,float* para) //固定截止频率的FIR
    {
        float FIR_State[BLOCK_SIZE+FIR_ORDER] ;   //FIR滤波器状态缓存
        arm_fir_instance_f32 FIR_Sta; //定义结构体S
        arm_fir_init_f32(&FIR_Sta, FIR_LEN, para, FIR_State, BLOCK_SIZE); //初始化结构体
        for(u16 i=0;i<NUMBLOCKS;i++)
        {
            arm_fir_f32(&FIR_Sta, input + (i * BLOCK_SIZE), input + (i * BLOCK_SIZE),BLOCK_SIZE);
        }   
    }
    

    2)IIR滤波器与DSP库结合使用

    /*  IIR滤波器  */
    /*
    IIR的过渡带可以做的很窄,但是由于数据放缩的特性,
    且F4系列最多支持float型DSP算法,直接导致IIR滤波器
    阶数最多6阶左右,且反馈时间长\不稳定,因此一般选择FIR滤波器
    */
    static float IIR_State[4*IIR_Len];//IIR滤波器状态缓存 
    static arm_biquad_casd_df1_inst_f32 IIR_Sta;
    void IIR_test(float *Input,float* Output,u32 IIR_length)
    {
        arm_biquad_cascade_df1_init_f32(&IIR_Sta, IIR_Len, iir_params, IIR_State); //初始化结构体S 
        /* IIR滤波 */
        arm_biquad_cascade_df1_f32(&IIR_Sta, Input, Output, IIR_length); 
        arm_scale_f32(Output,ScaleValue,Output,IIR_length); //数据放缩
    }
    

    Ⅳ.总结

    理论高度决定实践高度

  • 本篇内容主要介绍了在电赛中的一项重要工作——数字滤波器的设计与使用。在初入数字信号处理领域时,我们需要先掌握数字滤波器的基础知识,清晰了解滤波器每一个参数的意义,只有这样,设计出来的滤波器才有理论支撑。在理论基础上,熟练掌握专业软件的使用,会让我们开发的效率大大提高。唯有多动手,勤思考,才能在电赛道路上越走越远!
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » 【电赛仪器仪表】基于MATLAB的数字滤波器设计与ARM官方DSP库的结合

    发表评论