历史上的今天
今天是:2025年02月19日(星期三)
2019年02月19日 | STM32F4学习笔记2——自建库函数整合FFT计算遇到的问题及方法
2019-02-19 来源:eefocus
最近采用FFT计算信号频谱,需要先减去信号均值,参考网上看到的范例,实现了功能,代码为:
arm_mean_f32(DataBuffer, SIG_N, &MeanData);
for (int16_t k = 0 ; k <= SIG_N - 1 ; k++) {
DeMeanDataBuffer[k] = DataBuffer[k] - MeanData;
}
arm_mean_f32(DeMeanDataBuffer, SIG_N, &MeanData2);
arm_status status;
arm_cfft_radix2_instance_f32 S;
status = ARM_MATH_SUCCESS;
status = arm_cfft_radix2_init_f32(&S, FFT_N,ifftFlag, doBitReverse);
arm_cfft_radix2_f32(&S,DeMeanDataBuffer);
arm_cmplx_mag_f32(DeMeanDataBuffer, FFT_Output, FFT_N);
但是上面这一段代码都要放在main函数中,对于追求简洁的我来说,这是无法忍受的。于是建头文件,自己写了个库函数,将上述代码打包,函数实现代码如下:
#include "xiao_fft.h"
#include "xiao_array.h"
void xiao_FFT_f32(
float32_t* FFT_Data,
uint32_t FFTSize,
float32_t* FFT_Mag)
{
float32_t MeanData = 0;
float32_t FFT_Mag[FFTSize];
float32_t DeMeanData[FFTSize*2];
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;
arm_mean_f32(FFT_Data, FFTSize*2, &MeanData);
for ( int32_t k = 0 ; k <= FFTSize*2 - 1 ; k++) {
*(DeMeanData+k) = *(FFT_Data+k) - MeanData;
}
arm_status status;
arm_cfft_radix2_instance_f32 S;
status = ARM_MATH_SUCCESS;
status = arm_cfft_radix2_init_f32(&S, FFTSize,ifftFlag, doBitReverse);
arm_cfft_radix2_f32(&S,FFT_Data);
arm_cmplx_mag_f32(FFT_Data, FFT_Mag, FFTSize);
return;
}
然而,问题出现了。函数始终无法返回FFT幅度值(FFT_Mag)。经断点调试发现,在函数arm_cfft_radix2_f32中进入了HardFault_Handler中断。在网上参考大神资料,发现原因如下:不要在函数内部定义超过几十个字节的大数组,不然会引起数组越界或堆栈溢出。而上述代码定义了大数组DeMeanData(我也不懂,但依照着修改,呵呵)。
1
按照这个约束,重新理清思路:先在main函数中去data均值,得到demean_data,然后再进行FFT。实现代码如下:
/////////////////////////////////////////////////////
xiao_demean_array_f32(DataBuffer,SIG_N,DeMeanDataBuffer);
xiao_FFT_f32(DeMeanDataBuffer,FFT_N,FFT_Output);
///////////////////////////////////////////////////
#include "xiao_array.h"
void xiao_demean_array_f32(
float32_t* xiao_array_data,
uint32_t xiao_array_size,
float32_t* xiao_array_demean_data)
{
float32_t mean_data = 0;
arm_mean_f32(xiao_array_data, xiao_array_size, &mean_data);
for ( int32_t k = 0 ; k <= xiao_array_size - 1 ; k++) {
*(xiao_array_demean_data+k) = *(xiao_array_data+k) - mean_data;
}
}
/////////////////////////////////////////////////////
#include "xiao_fft.h"
#include "xiao_array.h"
void xiao_FFT_f32(
float32_t* FFT_Data,
uint32_t FFTSize,
float32_t* FFT_Mag)
{
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;
arm_status status;
arm_cfft_radix2_instance_f32 S;
status = ARM_MATH_SUCCESS;
status = arm_cfft_radix2_init_f32(&S, FFTSize,ifftFlag, doBitReverse);
arm_cfft_radix2_f32(&S,FFT_Data);
arm_cmplx_mag_f32(FFT_Data, FFT_Mag, FFTSize);
return;
}
这下成功了!撒花庆祝!
另外,STM32的DSP库中,计算FFT时要求数据长度data_len必须是FFT点数FFT_Size的2倍。
史海拾趣
|
公司名称: Carrier Access 公司网址: http://www.carrieraccess.com 电子邮箱: lshi@carrieraccess.com,简历请注明信息出处 工作地点: 上海 外语要求: 英文良好 简历接收方式: 英文及中文 学历: 本科以上 职位描述: RESPONSIBILITIES: ...… 查看全部问答> |
|
大功率LED路灯顾名思义是大于30瓦以上,采用新型光源的路灯。目前LED路灯的标准一般是路面均匀度(uniformity of road suaceilluminance)的平均照度0.48。比值1:2,符合道路照度。(实际1/2中心光斑达到25LUX,1/4中心光强达到 15LUX,16米远的最 ...… 查看全部问答> |
|
Table of Contents 1. EE_FPGA 学习板板载资源简介 ........................................................................................... 42. EE_FPGA 学习板焊接必备的工具 ........................................................ ...… 查看全部问答> |
|
“如果还有人幻想用粘不干胶、贴塑料纸、抹机油的方式躲避电子眼,那么有了电子标签,一切都将沦为浮云。”互联网从业者黄小龙告诉记者,高峰期出行添堵,想要借用“大运专用道”的车友,也会因为电子车牌难以鱼目混珠。事实上,今年以来RFID(射频 ...… 查看全部问答> |




