STM32利用arm-dsp库进行FIR低通滤波【详细】

这篇具有很好参考价值的文章主要介绍了STM32利用arm-dsp库进行FIR低通滤波【详细】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

arm-dsp库官方已经封装好了,使用的时候需要把dsp库移植到工程里面,具体怎么移植网上可以找到教程

这里直接说怎么用FIR的流程:

一、Matlab里面生成所配置的阶数和系数

1、在Matlab命令窗口输入fdatool,回车,会弹出一个新窗口

STM32利用arm-dsp库进行FIR低通滤波【详细】,arm开发

2、在新窗口中的响应类型选择【低通】,设计方法选择【 FIR里面的最平坦】,滤波器阶数选择【指定阶 80】(这里以80举例),频率设置选择【Hz,Fs3200,Fc200】(同样也是举例,后面自己按照需求改动),选择完后点击设计滤波器,并在上方【编辑】中点击【转换结构】选择【Direct-Form FIR】在点击确认

STM32利用arm-dsp库进行FIR低通滤波【详细】,arm开发

 STM32利用arm-dsp库进行FIR低通滤波【详细】,arm开发

3、在上方选择【目标】中的【生成C的头文件】 ,改变导出类型为【单精度浮点】,然后点击生成保存到文件夹中

STM32利用arm-dsp库进行FIR低通滤波【详细】,arm开发

STM32利用arm-dsp库进行FIR低通滤波【详细】,arm开发

二、在keil 写相关程序

主要是用到了dsp库里面这两个函数

STM32利用arm-dsp库进行FIR低通滤波【详细】,arm开发

我们先把要处理的数据放进一个数组,我自己使用的ADC采集信号发生器发出的基频为100Hz的信号。

将ADC采集的数据转换为电压存入一个数组中

uint32_t i=0;
for(i=0;i<256;i++)
{
    inbuf[i]=(float)(ADC1_ConvertedValue[i]*3.3/4096);
}

接下来就要配置上面用的函数了

//FIR实例化结构体
 arm_fir_instance_f32 * S;

 还记得刚刚Matlab生成的文件吗?打开这个文件,复制这些到工程里面去。

STM32利用arm-dsp库进行FIR低通滤波【详细】,arm开发

//FIR滤波器系数个数
uint16_t numTaps=81;
//FIR滤波器系数
float32_t  pCoeffs[81]={
  3.671998324e-22,2.631265729e-20,9.278031016e-19, 2.14557019e-17,3.659253801e-16,
  4.907191783e-15,5.387333849e-14, 4.97747839e-13,3.948472625e-12,2.730093235e-11,
  1.664632598e-10,9.033196413e-10,4.394613118e-09,1.927893756e-08,7.661567736e-08,
  2.767831404e-07,9.112107477e-07,2.737595878e-06,7.507435839e-06,1.876901842e-05,
  4.263511073e-05,8.741336933e-05,0.0001597262308,0.0002535805688,0.0003294369671,
  0.0002852701291,-6.710144226e-05,-0.0009913889226,-0.002741852077, -0.00537379086,
   -0.00846511405, -0.01084412821, -0.01049835142,-0.004857060499, 0.008461467922,
    0.03057124838,   0.0603001751,  0.09375944734,   0.1249034405,   0.1470876038,
     0.1551340818,   0.1470876038,   0.1249034405,  0.09375944734,   0.0603001751,
    0.03057124838, 0.008461467922,-0.004857060499, -0.01049835142, -0.01084412821,
   -0.00846511405, -0.00537379086,-0.002741852077,-0.0009913889226,-6.710144226e-05,
  0.0002852701291,0.0003294369671,0.0002535805688,0.0001597262308,8.741336933e-05,
  4.263511073e-05,1.876901842e-05,7.507435839e-06,2.737595878e-06,9.112107477e-07,
  2.767831404e-07,7.661567736e-08,1.927893756e-08,4.394613118e-09,9.033196413e-10,
  1.664632598e-10,2.730093235e-11,3.948472625e-12, 4.97747839e-13,5.387333849e-14,
  4.907191783e-15,3.659253801e-16, 2.14557019e-17,9.278031016e-19,2.631265729e-20,
  3.671998324e-22
};
//FIR滤波器状态变量暂存:数组的大小=numTaps+blocksize-1
float32_t  pState[336]={0.0f};
//块处理大小
uint32_t blockSize=256;
//输入数据
float32_t inbuf[256]={0};

//输出数据
float32_t outbuf[256]=	{0};

 接下来就要调用上面说的函数了,不过我们先要为arm_fir_instance_f32这个结构体开辟一个空间

// 为FIR实例分配内存  
S = (arm_fir_instance_f32 *)malloc(sizeof(arm_fir_instance_f32));  
if (S == NULL) 
{
    // 内存分配失败,处理错误  
    return;  
}

malloc和free这两个函数需要包含#include <stdlib.h>这个头文件,不然会报错

这行代码 S = (arm_fir_instance_f32 *)malloc(sizeof(arm_fir_instance_f32)); 是C语言中动态内存分配的一个常见用法。这行代码做了以下几件事情:

  1. sizeof(arm_fir_instance_f32):计算arm_fir_instance_f32结构体类型所占用的字节数。
  2. malloc(sizeof(arm_fir_instance_f32)):调用malloc函数,请求分配足够存储一个arm_fir_instance_f32结构体的内存空间。malloc返回的是一个指向所分配内存区域的void指针。
  3. (arm_fir_instance_f32 *):将void指针强制类型转换为arm_fir_instance_f32指针。这是因为malloc返回的是void指针,而我们需要一个指向arm_fir_instance_f32的指针来操作分配的内存。
  4. S = ...:将转换后的指针赋值给S,这样S现在就指向了一块新分配的内存,这块内存足够存储一个arm_fir_instance_f32实例。

重要的是要注意,在使用malloc分配内存之后,你有责任在不再需要这块内存时使用free函数来释放它,以避免内存泄漏。

另外,务必检查malloc的返回值是否为NULL。如果malloc无法分配所需的内存(例如,由于内存不足),它将返回NULL。在这种情况下,你应该处理这个错误情况,而不是尝试使用NULL指针,因为这会导致程序崩溃。

现在再调用那两个函数

arm_fir_init_f32(S,numTaps,pCoeffs,pState,blockSize);
arm_fir_f32(S,inbuf,outbuf,blockSize);

 这样在outbuf数组中就是低通滤波后的数据了

最后我们使用free函数释放内存,避免内存泄漏

free(S);      // 释放内存 
S = NULL; // 将指针设置为 NULL,以避免悬挂指针

OK,用串口打印出来看看效果

STM32利用arm-dsp库进行FIR低通滤波【详细】,arm开发

 蓝色的方波是原始信号,橙色的正弦波是经过低通滤波的信号,效果还是ok的

到此,就完成了软件滤波文章来源地址https://www.toymoban.com/news/detail-842886.html

到了这里,关于STM32利用arm-dsp库进行FIR低通滤波【详细】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA设计FIR滤波器低通滤波器,代码及视频

    名称:FIR滤波器低通滤波器 软件:Quartus 语言:Verilog/VHDL 本资源含有verilog及VHDL两种语言设计的工程,每个工程均可实现以下FIR滤波器的功能。 代码功能: 设计一个8阶FIR滤波器(低通滤波器),要求截止频率为20KHz,使用线性相位结构。 参数设计方法: 使用matlab软件设计滤

    2024年02月08日
    浏览(52)
  • STM32 FIR实时数字滤波器实现

    首先是生成不同周期的正弦波:         由于定时器设置为250us进入一次中断,每秒可进入中断4000次,为了生成25HZ的正弦信号,一个周期内生成160个数据;为了生成200HZ的正弦信号,一个周期内生成20个数据,故代码如下:     sin_1=arm_sin_f32(3.141592654*i/80)+1;//25HZ 信号   

    2024年02月14日
    浏览(45)
  • 用C语言实现一个FIR低通滤波器算法

    +v hezkz17进数字音频系统研究开发交流答疑    以下是一个基于C语言的FIR低通滤波器算法的实现: #include stdio.h #include stdlib.h #define N 5     // 滤波器长度 #define M 100   // 输入数据长度 double h[N] = {0.2, 0.3, 0.4, 0.1, 0.0};  // 滤波器系数 int main() {     double x[M], y[M];     // 生成输入信

    2024年02月16日
    浏览(42)
  • FPGA 的 DSP:Verilog 中的简单 FIR 滤波器

    本项目介绍如何用 Verilog 实现一个带有预生成系数的简单 FIR 滤波器。 简陋的 FIR 滤波器是 FPGA 数字信号处理中最基本的构建模块之一,因此了解如何利用给定的抽头数和相应的系数值组装一个基本模块非常重要。因此,在这个关于在 FPGA 上入门 DSP 基础知识的实用方法迷你系

    2024年03月17日
    浏览(42)
  • STM32自带的DSP库的滤波初体验(一)

    最近在弄STM32自带的DSP库里的滤波,记录一下:         整个滤波的过程比较简单,先是调用arm_fir_init_q15函数来初始化instance_q15_S,然后用三角函数生成一个50Hz+6000Hz的正弦数组,放在testInput数组中,最后调用arm_fir_q15函数来滤波。         这个里面需要注意的是,滤波系

    2024年02月14日
    浏览(36)
  • [DSP学习笔记]基于TMS320F28335的FIR滤波实现

    首先进入TI官网,搜索C2000 wave,进行下载安装。 安装完成后,在2000 wave的安装目录下,进入以下目录:C2000Ware_4_02_00_00librariesdspFPUc28 以我本地的安装目录为例:E:tic2000C2000Ware_4_02_00_00librariesdspFPUc28 复制include、source文件夹到新建工程中。再根据选用的DSP型号对文件夹内

    2024年02月10日
    浏览(82)
  • 基于FPGA的FIR低通滤波器实现(附工程源码),matlab+vivado19.2+simulation

    本文为FPGA实现FIR滤波器仿真过程,附源代码。 提示:以下是本篇文章正文内容,下面案例可供参考 打开MATLAB在命令行窗口输入: fadtool 回车后在滤波器设计界面设置滤波器参数如下 之后点击如图标志,设置定点,在菜单栏\\\"目标(R)\\\"出选择生成对应滤波器系数.COE文件 mat

    2024年02月11日
    浏览(48)
  • 上海山景SH-ARC DSP音频处理器低通滤波算法实现

      +hezkz17进入数字音频答疑 上海山景DSP音频处理器介绍:  上海山景DSP音频处理器是一种数字信号处理器,专门用于音频信号的处理和增强。它采用先进的数字信号处理技术和算法,能够对音频信号进行实时处理,并且具有高效、稳定、可靠等特点。 该处理器可以应用于各种

    2024年02月13日
    浏览(32)
  • STM32HAL库定时器中断、按键中断、串口中断、按键消抖和低通滤波算法详解

    本文将详细介绍STM32HAL库中的定时器中断、按键中断、串口中断的使用方法,以及按键消抖和低通滤波算法的实现。希望能对您的STM32开发提供帮助。 目录 1. 定时器中断 2. 按键中断 3. 串口中断 4. 按键消抖 5. 低通滤波算法 一、定时器中断 定时器中断是STM32开发中常用的一种

    2024年02月15日
    浏览(53)
  • 【STM32】使用HAL库进行电机测速,原理、代码、滤波

    参考资料: https://blog.csdn.net/lzzzzzzm/article/details/119416134 野火STM32电机开发教程 常见的编码器有两种,分别为霍尔编码器和GMR编码器。 1.1 霍尔编码器 ​ 霍尔编码器圆盘上分布有磁极,当圆盘随电机主轴转动时,会输出两路相位差90°的方波,用这两路方波可测出电机的转速和

    2024年01月24日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包