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

news/2025/1/15 22:07:36/

主要内容

  • Ⅰ. 数字滤波器基础知识
    • 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; //定义结构体Sarm_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); //数据放缩
}

Ⅳ.总结

理论高度决定实践高度

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

http://www.ppmy.cn/news/520356.html

相关文章

TMS320F28335调用官方库进行FFT频谱分析

移植 首先进入TI官网下载软件支持包&#xff0c;我们需要的FFT官方包就在这里边。 TMS320F28335 data sheet, product information and support | TI.com 下载完成后&#xff0c;解压。进入以下目录 C2000Ware_4_01_00_00_Software__all\C2000Ware_4_01_00_00\libraries\dsp…

【STM32】STM32F4调用DSP库实现FFT运算

写在前面 最近在整理之前的stm32笔记&#xff0c;打算把一些有价值的笔记发到CSDN分享一下。 奎斯特定理 在进行模拟/数字信号的转换过程中&#xff0c;当采样频率F大于信号中最高频率 fmax 的 2 倍时(F>2*fmax)&#xff0c;采样之后的数字信号完整地保留了原始信号中的信…

【STM32】 DSP库函数的一些基本使用

对于一些刚接触STM32的童靴来说&#xff0c;DSP库一定是一个陌生的东西。通俗来说&#xff0c;DSP库就是为了让MCU能够使用像DSP&#xff08;数字信号处理的芯片&#xff09;功能弄的一些官方库函数&#xff0c;它是基于MCU的FPU&#xff08;浮点运算功能&#xff09;的&#x…

STM32_arm_sin_f32和sin的区别

FOC控制中会用到三角函数 调试通信的时候&#xff0c;也会用三角函数产生一个测试波形 优化三角函数的运行时间是一个不可避免的事情&#xff0c;而幸运的是&#xff0c;前人已经把树种上了。 用专用的浮点运算单元FPU来做浮点运算&#xff0c;比用STM32本身来做浮点运算要快…

STM32F1 FFT初试

1、STM32有dsp库&#xff0c;百度一堆的文章&#xff0c;注意有f4有硬件fft可以使用arm_rfft_fast_init_f32&#xff0c;F1不能使用&#xff0c;F1可以使用arm_cfft_radix4_init_f32&#xff0c;256长度1024长度&#xff0c;arm_cfft_radix2_init_f32 512长度。 2、采样率FFT_S…

UVM1.2究竟在UVM1.1上做了哪些升级

想必大家平时也没有很注意UVM1.1版本和UVM1.2版本的不同之处&#xff0c;只有在用一些以前UVM1.1能支持的功能&#xff0c;到了UVM1.2却出现编译报错&#xff0c;找不到对应的变量或者函数或者类的时候&#xff0c;才意识到这两个版本的差异。笔者也是遇到了1个打印问题&#x…

【webFlux】使用zip()或concatMap操作符处理两个表,基于条件修改两个表

要响应式地处理两个列表,并基于条件修改第一个列表的一个bean,并根据条件修改第二个列表中对应bean的属性,你可以使用RxJava的操作符来实现。 以下是一个示例代码,展示了如何响应式地处理两个列表并进行相应的修改操作: Observable<List<Bean1>> list1Obser…

基于Web的数字家庭网站设计与实现【附开题报告和万字文档(Lun文)】

主要功能 前台登录&#xff1a; ①主页&#xff1a;新闻信息展示、最新动态、家庭亲子视频展示、亲友动态展示 ②论坛&#xff1a;发布帖子 ③家庭亲自视频&#xff1a;视频类型分类、亲子视频标题 ④家庭日记&#xff1a;日记类型分类、日记标题 ⑤新闻信息&#xff1a;新闻类…