最近,因为项目需要在STM32F103系列处理器上,对采集的音频信号进行FFT运算,然而STM32F103毕竟不是STM32F4系列的处理器,对于一般的FFT运算程序还是比较缓慢的。

幸亏官方提供了针对FFT的官方库,但是去官网找了半天居然找不到那个库的下载,好像官方早就把那个库下架了,估计是为了给带DSP指令集的F4系列让路。然后就只好从别人的项目中把这个官方库给扒出来了……

下载地址:https://pan.baidu.com/s/1GiUJgEkQxDAk79iddXKsaA 提取码: dn2d

FFT的意义

对于很多人来说,采样频率FFT点数之间的关系可能还是不太清楚。下面就来简单分析一下:

根据采样定理,采样频率必须是被采样信号最高频率的2倍。比如,需要采集音频信号,并且需要被观察到的音频频率的频率范围是20Hz到20KHz,那么使用的采样频率就必须大于40kHz。如果需要观察到的音频频率范围为0Hz到600Hz,那么使用的采样频率只需要大于1200Hz即可。

而FFT点数与采样频率之间有什么关系呢?本质上并没有什么关系,但是FFT点数的大小直接关系到频率分辨率。怎么来说呢?

假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。同时,FFT后的N个点,开始的那个点表示直流分量(即0Hz),而最后的那个点的再下一个点表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。即,某点n所表示的频率为:Fn=(n-1)*Fs/N。这就表示,Fs/N就是频率分辨率

不太理解的,可以查看博客:FFT后的物理意义。

FFT官方库的使用条件

  • FFT官方库在使用上并不灵活:属于基4的FFT,即FFT点数必须是4^n。也就是说,如果要做512点或2048点的FFT,那么对不起,没法使用官方库了;
  • FFT官方库的输入输出是等长的,即256点的FFT输入也必须是256点,如果你的输入小于这个长度,是没有任何性能提升的。

FFT官方库的使用

准备工作

下载得到STM32的DSP库之后,就可以将其添加到自己的工程项目中了。

其中,stm32_dsp.h和table_fft.h两个文件是必须添加的。stm32_dsp.h是STM32的DSP库的头文件。

另外,对于**.s文件可以有选择的添加**(用到那个添加那个即可)。由于本文只用到了256点的FFT,所以这里只添加了cr4_fft_256_stm32.s文件。

FFT函数说明

进行256点的FFT,只需要调用STM32 DSP库函数中的cr4_fft_256_stm32()函数即可。该函数的原型为:

void cr4_fft_256_stm32(void *pssOUT, void *pssIN, uint16_t Nbin);

其中,参数pssOUT表示FFT输出数组指针,参数pssIN表示要进行FFT运算的输入数组指针,参数Nbin表示了点数。至于该函数的具体实现,因为是用汇编语言编写的,我也不懂,这里就不妄谈了。

需要说明的是:按照FFT官方库的说明,pssOUT和pssIN都必须是32位的数据类型,其中高16位存储实部,低16位存储虚部。对于pssIN来说,低16位存储的虚部总是为0

代码实例

假设ADC采样的声音数据为adc_buf[NPT],FFT运算的输入数组为lBufInArray[NPT]。由于FFT计算出来的数据是对称的,因此通常而言输出数组取一半的数据,为lBufOutArray[NPT/2]。除此之外,还定义各次谐波幅值lBufMagArray[NPT/2]。即:

#define NPT 256uint32_t adc_buf[NPT]={0};
long lBufInArray[NPT];
long lBufOutArray[NPT/2];
long lBufMagArray[NPT/2];

调用FFT官方库的代码为:

//填充数组
for(i=0;i<NPT;i++)//这里因为单片机的ADC只能测正的电压 所以需要前级加直流偏执//加入直流偏执后,需要在软件上减去2048即一半,达到负半周期测量的目的(需要根据具体情况来进行配置)lBufInArray[i] = ((signed short)(adc_buf[i]-2048)) << 16;cr4_fft_256_stm32(lBufOutArray, lBufInArray, NPT);

同时,计算各次谐波幅值的函数为:

void GetPowerMag()
{signed short lX,lY;float X,Y,Mag;unsigned short i;for(i=0; i<NPT/2; i++){lX  = (lBufOutArray[i] << 16) >> 16;lY  = (lBufOutArray[i] >> 16);//除以32768再乘65536是为了符合浮点数计算规律X = NPT * ((float)lX) / 32768;Y = NPT * ((float)lY) / 32768;Mag = sqrt(X * X + Y * Y) / NPT;if(i == 0)lBufMagArray[i] = (unsigned long)(Mag * 32768);elselBufMagArray[i] = (unsigned long)(Mag * 65536);}
}

【STM32】使用STM32提供的DSP库进行FFT(附详细代码)相关推荐

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

    写在前面 最近在整理之前的stm32笔记,打算把一些有价值的笔记发到CSDN分享一下. 奎斯特定理 在进行模拟/数字信号的转换过程中,当采样频率F大于信号中最高频率 fmax 的 2 倍时(F> ...

  2. STM32浮点运算单元(FPU)和DSP库使用

    文章目录 1. 浮点运算单元(FPU) 1.1 所用硬件 1.2 配置FPU 2. CMSIS-DSP 2.1 添加DSP库 2.2 测试 ====>>> 文章汇总(有代码汇总) & ...

  3. STM32F4使用FPU+DSP库进行FFT运算的测试过程一

    测试环境:单片机:STM32F407ZGT6   IDE:Keil5.20.0.0  固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...

  4. STM32 PB3/PB4不能正常使用的解决办法 + 附实现代码

    STM32 PB3或者PB4不能正常使用的解决办法(亲试有效(* ^ ▽ ^* )) 最近在用STM32F103VCT6做项目,发现PB3和PB4这两个引脚不可控制为低电平,一直都是高电平.后来查资料 ...

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

    文章目录 前言 一.STM32L496简介? 二.FFT简介 三.STM32CubeMx配置 四.MDK配置与程序 4.1宏定义的添加 4.2程序编写 五.结果 总结 前言 本篇文章采用的是ST公司的 ...

  6. STM32CubeIDE(stm32f767)添加DSP库

    对于stm32f4 系列可以使用STM32Cube添加相应的库,自动生成代码.可以参考下面写的文章 (1条消息) STM32CubeMX关于添加DSP库的使用_W_oilpicture的博客-CSDN ...

  7. STM32F4单片机ADC采样及ARM-DSP库的FFT

    模拟信号经过ADC采样后变成数字信号,数字信号可以进行FFT运算,在频域中更容易分析信号的特征.本文将介绍如何用STM32F4的进行ADC采样,并利用ARMDSP库里的FFT算法对ADC采样值进行快速 ...

  8. STM32 HAL库 CUBEMX FPU 和 DSP库

    转自:https://blog.csdn.net/yuleitao/article/details/105621492?ivk_sa=1024320u FPU 简介 FPU 即浮点运算单元(Float ...

  9. stm32使用dsp库,结合Matlab进行FIR滤波器设计

    首先我们打开Matlab.在命令串口输入fdatool,按回车. Response Type :这里可以设置滤波器类型 lowpass(低通),highpass(高通),banpass(带通),ban ...

  10. STM32 DSP库

    DSP库简介 DSP库主要包含以下几个分库: BasicMathFunctions 基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算. CommonTables arm_common_ ...

最新文章

  1. 5. 编程规范和编程安全指南--JavaScript
  2. rhel系统启动过程_Linux 的启动流程
  3. netty:IO模型
  4. 基于FPGA的bubble游戏开发
  5. linux python2.7安装教程_Linux中RedHat下安装Python2.7开发环境的详细教程-学派吧-
  6. eclipse安装SVN插件报错Unable to connect
  7. java代码里的JSON格式怎么写好看_谁会不爱让代码骚里骚气的VSCode扩展插件呢?...
  8. 2019ICPC(徐州) - Colorful String(哈希+二分+动态规划/回文自动机)
  9. linux虚拟机状态转换图,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
  10. java myeclipse The type java.lang.CharSequence cannot be resolved. It is indirectly referen
  11. windows下安装vundle
  12. 收件服务器主机名未响应,邮箱收件服务器主机名是什么
  13. 爬虫demo_全自动爬虫,你爱了么!解放双手的时刻
  14. 禁止用户用手机浏览时上下滑动
  15. Android 博文
  16. 一颗电阻失效引发的设计思考
  17. 三菱Q系列常用注意事项
  18. 使用51单片机驱动航模无刷电机
  19. 顺丰科技机器学习面试
  20. mac怎么给移动硬盘分区

热门文章

  1. 【第四篇】用 Qt 实现电子白板
  2. 交互式电子白板与计算机通过什么链接,交互式电子白板的作用详细介绍
  3. 违反GPL协议赔偿50万,国内首例!
  4. Footer置于页面底部的技巧
  5. 最大化参数 火车头_火车采集器,您身边的的网页数据采集专家!
  6. Ubuntu 搭建OpenGrok
  7. 人工神经网络通过调整,神经网络怎么调参数
  8. 第一博客,行走在编程道路上的菜鸟
  9. 000webhost免费申请
  10. 【比赛回顾】广工大2020级年ACM第一次月赛——Dio的面包工坊