STM32CubeMx移植DSP库 傅立叶变化(FFT)测试

这篇具有很好参考价值的文章主要介绍了STM32CubeMx移植DSP库 傅立叶变化(FFT)测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本篇文章采用的是ST公司的STM32L496的DSP库进行FFT函数测试,将计算得到的数据通过串口工具打印出来,其他支持DSP库的型号也是类似做法。


一、STM32L496简介?

STM32L496为超低功耗Cortex-M4内核的MCU,具有64个引脚,并且外设资源丰富(4个IIC硬件通信接口、5个串口通信接口、3个SPI通信接口、3个12位内置ADC等)

二、FFT简介

FFT即快速傅立叶变换,可以将一个时域信号变换到频域。因为有些信号在时域上是很难看出什么特征的,但是如果将其变换到频域之后,就很容易看出特征了,这也就是很多信号分析都会采用FFT变换的原因。其次,FFT可以将一个信号的频谱和相位提取出来,这在频谱和相位分析中也是经常用到的。
在实际工程中,一般的处理过程是先对一个信号在时域进行采样,如ADC采样,按照一定大小采样频率F去采集信号,采集N个点,那么通过对这N个点进行FFT运算,就可以得到这个信号的频谱和相位特征。


三、STM32CubeMx配置

这里主要讲解对DSP库的配置,其他基础配置略过。
STM32CubeMx移植DSP库 傅立叶变化(FFT)测试
STM32CubeMx移植DSP库 傅立叶变化(FFT)测试
STM32CubeMx移植DSP库 傅立叶变化(FFT)测试
STM32CubeMx移植DSP库 傅立叶变化(FFT)测试
通过以上步骤就完成了对STM32CubeMx DSP库的配置,然后就可以点生成代码。

四、MDK配置与程序

4.1宏定义的添加

需要添加4各宏定义,分别为:(注意:是英文状态下的分号;内核是M4就是ARM_MATH_CM4,M3就是ARM_MATH_CM3)

ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING

STM32CubeMx移植DSP库 傅立叶变化(FFT)测试

4.2程序编写

STM32的DSP库里面,提供了定点和浮点FFT实现方式,并且有基4和基2的,对于基4的FFT输入点数必须是4的n次方,而基2的FFT输入点数则必须是2的n次方,且基4的FFT算法比基2要快,大家可以选择自己实现的方式。
这里采用基4浮点FFT来实现FFT变换,所用到的函数分别为:

arm_status arm_cfft_radix4_init_f32(arm_cfft_radix4_instance_f32 *S,uint16_t fftLen,uint8_t ifftFlag,uint8_t bitReverseFlag)
void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 *S,float32_t *pSrc)
void arm_cmplx_mag_f32(float32_t* pSrc,float32_t* pDst,uint32_t numSamples)

第一个函数是用于初始化FFT运算相关参数的,第二个函数是执行基4浮点FFT运算的,第三个函数是计算复数模值的。通过这三个函数即可完成FFT计算并取模值。
1、头文件的添加
STM32CubeMx移植DSP库 傅立叶变化(FFT)测试
2、程序实现
本次暂时先对100+10arm_sin_f32(2PIi/FFT_LENGTH)+30arm_sin_f32(2PIi4/FFT_LENGTH)+50arm_cos_f32(2PIi*8/FFT_LENGTH)函数进行FFT变换,求频域幅值和相位。

#define FFT_LENGTH 1024
float fft_inputbuf[FFT_LENGTH*2];
float fft_outputbuf[FFT_LENGTH];
float Phase_Result[FFT_LENGTH];

/***************************进行傅立叶变换********************************************/	
       arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);	   
	   for(int i = 0; i<FFT_LENGTH; i++)
	  {  fft_inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i/FFT_LENGTH)+30*arm_sin_f32(2*PI*i*4/FFT_LENGTH)+50*arm_cos_f32(2*PI*i*8/FFT_LENGTH);
		  fft_inputbuf[2*i+1]=0;
	  }
	  arm_cfft_radix4_f32(&scfft,fft_inputbuf); //FFT计算(基4运算)
	  for(int i=0;i<FFT_LENGTH;i++) //求各点的初始相位
	  {
		Phase_Result[i] = atan2(fft_inputbuf[2*i+1],fft_inputbuf[2*i]); //范围为(-PI,PI)
		Phase_Result[i]=(Phase_Result[i]*180.0f)/PI;
	  }
	  
	  arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //求各频点的模
	  
/***************************处理变换结果*********************************************/	  
	  for(int i = 0; i < FFT_LENGTH; i++)
	  {
		  printf("fft_outputbuf[%d]:%f\r\n", i, fft_outputbuf[i]); //幅值
		  printf("Phase_Result[%d]:%f\r\n", i ,Phase_Result[i]); //相位
		  HAL_Delay(1000);
	  }

五、结果

STM32CubeMx移植DSP库 傅立叶变化(FFT)测试
查看以上数据,可知,第0,1,4,8,1016,1020,1023这几个点的幅值比较大。FFT变换具有对称性,我们只需要看前面半部分,后半部分和前半部分是对称关系,如1和1023,4和1020,8和1016等。

总结

STM32CubeMx移植DSP库测试FFT变换基本配置和操作步骤就是这样,实际应用中经过ADC采样的离散数据点的FFT变换也是相同的操作。文章来源地址https://www.toymoban.com/news/detail-401892.html

到了这里,关于STM32CubeMx移植DSP库 傅立叶变化(FFT)测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FFCNet:基于傅立叶变换的频率学习和复杂卷积网络用于结肠疾病分类

    提出了一种基于傅立叶的频率复杂网络(FFCNet)用于结肠疾病分类: 将复杂卷积网络与频率学习相结合,以克服实际卷积操作造成的相位信息损失 傅立叶变换将图像的平均亮度转移到光谱中的一个点(DC分量),通过解耦图像内容和亮度来减轻亮度不均匀的影响。 FFCNet中的

    2024年02月06日
    浏览(32)
  • STM32 DSP库CUBEMX配置+FFT频率计算

    使用DSP中的函数加快计算。 本文首先讲述如何通过添加dsp库。 再讲述使用DSP库进行实数FFT运算。(FFT运算用到了前面讲述的STM32CubeMX-ADC hal库 3定时器触发) 参考1文章 参考2文章 先找到文件路径 然后设置如下路径 双击如下并找到路径 D:STM32CubeMXSTM32Cube_FW_F4_V1.26.2DriversCMS

    2024年02月16日
    浏览(38)
  • 压缩编码之变换的选择之离散余弦变换(DCT)和离散傅立叶变换(DFT)——数字图像处理

    变换的选择是一个关键的考量因素,它决定了数据是如何被压缩的。选择变换时考虑以下几个重要原则: 数据去关联性 :变换的目的之一是减少数据中的相关性。例如,在图像压缩中,像素间往往高度相关。通过适当的变换,如离散余弦变换(DCT),可以将这些相关性转化

    2024年02月02日
    浏览(51)
  • 【STM32】STM32F4调用DSP库实现FFT运算

    最近在整理之前的stm32笔记,打算把一些有价值的笔记发到CSDN分享一下。 在进行模拟/数字信号的转换过程中,当采样频率F大于信号中最高频率 fmax 的 2 倍时(F2*fmax),采样之后的数字信号完整地保留了原始信号中的信息。 设采样频率(单位时间可以采多少个信号样本)为 F

    2023年04月24日
    浏览(37)
  • STM32移植DSP库详细步骤

            先将下载的DSP库文件放到需要的项目目录下。                  随后打开keil项目进入配置。右键项目名称,点击管理项目选项;创建一个DSP文件添加依赖后点击OK。            点击小魔术棒,点击C/C++选项,在Define中添加ARM_MATH_CM3,然后添加DSP的.c和.h文件路径,

    2024年02月13日
    浏览(37)
  • STM32CubeMX关于添加DSP库的使用

    人生如逆旅,我亦是行人。 STM32 系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的 ARM Cortex-M3 内核 而 DSP 应该是 TMS320 系列, TMS320 系列 DSP 是 软件可编程器件 ,具有通用微处理器所具有的方便灵活的特点。其基本特点有: 哈佛结构,流水线操作 ,专用的

    2023年04月08日
    浏览(35)
  • cubeMX+CLion开发STM32,添加DSP库

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、使用cubeMX创建工程并添加DSP库 二、修改Cmake配置 总结 前段时间看了改用CLion做STM32的开发,使用cubeMX添加DSP库,生成项目后编译报错undefined reference to `arm_sin_f32\\\',参考了很多文章都是

    2024年02月13日
    浏览(39)
  • STM32+CubeMX移植threadx

    一、前言 想要在STM32的芯片上使用threadx,可以使用CubeMX来进行移植。计划不使用keil,使用makefile进行编译,在vscode中编写代码并调试。但是实际移植过程中出现了问题,看了一天才找到问题所在,在此进行记录,也帮助其他遇到问题的朋友们快速解决问题。 二、VSCode配置 具

    2024年02月04日
    浏览(38)
  • 2018年电赛A题 软件部分 STM32 FFT 时域到频域 STM32cubeMX HAL

    题目要求:任意波信号发生器输出非正弦信号时,基波频率范围为50Hz~200Hz,测量电流信号基波频率,频率测量精度优于1%;测量基波及各次谐波分量的幅度(振幅值),电流谐波测量频率不超过1kHz,测量精度优于5% 。 实现方式:利用STM32单片机内置ADC对待测信号进行采集,

    2024年02月15日
    浏览(88)
  • STM32 CubeMX LwIP + freertOS 移植

    开发板: 官方 STM32F746  MCU型号:STM32F746NGH 网卡型号:LAN8742A  原理图如下 先用裸机测试LAN8742A的网卡驱动 使用CubeMX创建工程 系统时钟和时基定时器如下 无系统LWIP协议栈设置,静态IP地址,关闭DHCP 生产代码,下载进开发板。开发板网口与电脑网口通过网线直连,设置电脑本

    2024年01月16日
    浏览(83)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包