社区导航

 

搜索
查看: 152|回复: 1

[原创] NUCLEO-G431RB测评 使用库做FFT

[复制链接]

220

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-10-10 15:08 | 显示全部楼层 |阅读模式
本帖最后由 viphotman 于 2019-10-10 16:24 编辑

NUCLEO-G431RB测评 FFT
一 文件位置

在STM32CubeG4_V1.1.0\STM32Cube_FW_G4_V1.0.0\Drivers\CMSIS\Lib\ARM 里有ARM 公司的库文件;

arm_cortexM4lf_math.lib 是小端模式的有浮点运算的M4的lib;

st32g431_fft1.PNG 还要下面的.h文件;

st32g431_fft2.PNG

二 FFT的函数

arm_cfft_f32 函数

  void arm_cfft_f32(
  const arm_cfft_instance_f32 * S,
  float32_t * p1,
  uint8_t ifftFlag,
  uint8_t bitReverseFlag);

S 参数是是一个结构体指针是一个结构体指针,当一个常量用,和旋转因子有关,不同点的FFT选不同的参数;

p1 参数是输入数组,长度应该是运算点数的两倍,计算完输出的数据也放这里;

S 参数是FFT正反变换,=0是正变换,1是反变换

bitReverseFlag 参数是倒位序

 

st32g431_fft5.PNG
三 工程修改

 加入宏ARM_MATH_CM4;

 

st32g431_fft3.PNG 加入头文件地址

st32g431_fft4.PNG

 

加入lib

st32g431_fft8.PNG

加入代码

/* Includes ------------------------------------------------------------------*/
#include "main.h"

#include "arm_math.h"
#include "arm_const_structs.h"

 加入变量

#define NPT 2048//4096
uint32_t fftSize = NPT/2; //NPT/2
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;

float32_t fft_input[NPT];
float32_t fft_output[NPT]; //NPT/2

加入fft测试code ,再在main中调用这个函数;

 

void fft_test()
{
   int i = 0;
	// 
	for(i=0;i<NPT/2 ;i++)
	{
		// 100Hz sin, 1000 sample
		fft_input[2*i] = 1.2f*arm_sin_f32(2*3.1415926f*55*i/1000)+1;
		fft_input[2*i+1] = 0;
	}
	  /* Ö´ÐÐFFTÔËË㣬½á¹û´æ·ÅÔÚÊäÈëÊý×é */
	 
  arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_input, ifftFlag, doBitReverse);  //´Ë´¦Ê¹ÓÃarm_cfft_sR_f32_len1024Òò×Ó£¬Êý¾Ý±ØÐëÊÇ2048 ÊÇ*SX2Åà¹Øϵ
  //arm_cfft_f32(&arm_cfft_sR_f32_len2048, fft_input, ifftFlag, doBitReverse);
	//arm_cfft_f32(&arm_cfft_sR_f32_len4096, fft_input, ifftFlag, doBitReverse); 
	/* È¡¸÷¼ÆËã½á¹ûµÄ¾ø¶ÔÖµÀ´µÃµ½ÆµÂÊÇ¿¶È(·ùÖµ) */                                 //FFTµãÊýΪ&arm_cfft_sR_f32_len32/2(³ýÒÔ2)²ÅÊÇFFTµÄµãÊý
  arm_cmplx_mag_f32(fft_input, fft_output, fftSize);
  /* È¡×î´óÖµ¼°ÆäÖ÷ƵλÖà */
  //arm_max_f32(fft_output, fftSize, &maxValue, &testIndex);
		//printf("maxValue=%f\r\n", maxValue);

	 for(i=0; i<fftSize; i++)
	 {
			 printf("fft %d = %f\r\n",i, fft_output);
	 }
}

修改下面code

fft_input[2*i] = 1.2f*arm_sin_f32(2*3.1415926f*55*i/1000)+1; // 55Hz 的sin波 1000Hz采样率

打结果如下,索引56是最大值,计算现在信号的频率 = 1000/1024 *56 = 54.68Hz

st32g431_fft6.PNG

fft_input[2*i] = 1.2f*arm_sin_f32(2*3.1415926f*100*i/1000)+1; // 100Hz 的sin波 1000Hz采样率

打结果如下,索引102是最大值,计算现在信号的频率 = 1000/1024 *102 =99.609Hz

 

st32g431_fft7.PNG
此内容由EEWORLD论坛网友viphotman原创,如需转载或用于商业用途需征得作者同意并注明出处

来源:EEWorld stm32/stm8板块,转载请附上链接


回复

使用道具 举报

30

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-10-13 11:13 | 显示全部楼层

666,这是高手。学习了

stm32f103资料

硬氪网



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-15 07:37 , Processed in 0.096922 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表