历史上的今天
返回首页

历史上的今天

今天是: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倍。


推荐阅读

史海拾趣

Endicott Research Group Inc (ERG)公司的发展小趣事

近年来,随着全球对环保和节能的日益重视,ERG积极响应绿色发展的号召,开始研发更加高效节能的电源产品和LED照明解决方案。他们通过优化电路设计、采用新型材料和改进生产工艺,成功降低了产品的能耗和废弃物产生。这些环保举措不仅提升了公司的社会形象,还为其赢得了更多环保意识强的客户的青睐。同时,ERG也积极参与各种环保公益活动,为推动行业的绿色发展做出了积极贡献。

以上五个故事,客观地描述了ERG在电子行业中的发展历程和主要成就。从初创时期的艰苦奋斗,到不断拓展业务范围、加强技术研发、与科研机构合作以及积极响应环保号召,ERG始终保持着创新精神和进取心,为电子行业的发展做出了重要贡献。

Catalyst / ON Semiconductor公司的发展小趣事

在电子行业的早期,Catalyst / ON Semiconductor公司由一群富有远见和热情的工程师创立。他们看到了半导体技术在电子领域的巨大潜力,并决定投身于这一新兴的产业。初创时期,公司面临着资金短缺、技术难题和市场接受度低等多重挑战。然而,凭借团队成员的坚持不懈和勇于创新的精神,他们成功开发出了几款具有竞争力的半导体产品,并逐渐在市场上获得了一席之地。

AUSTIN公司的发展小趣事

随着汽车市场的不断变化和消费者需求的多样化,奥斯汀汽车也在不断调整市场策略和产品布局。公司根据市场需求推出了一系列新的车型,并积极拓展海外市场。虽然奥斯汀汽车在历史长河中经历了许多波折和挑战,但其品牌精神和传统始终得以传承和发扬。如今,奥斯汀汽车已经成为了英国汽车文化的重要组成部分,其经典车型和品牌形象仍然深受消费者喜爱。

这些故事展示了AUSTIN汽车公司在汽车行业中的发展历程,从创始与早期成功,到危机与重生,再到技术合作与国际化发展,以及产品创新与多样化,最终实现了市场调整与品牌传承。这些事实性的描述,旨在呈现AUSTIN汽车公司在历史长河中的真实面貌,而不涉及任何褒贬评价。

Advanced Analog公司的发展小趣事

随着公司的不断发展和壮大,Advanced Analog开始积极拓展国际市场。公司在全球范围内设立了多个分支机构和销售网络,与众多国际知名企业和品牌建立了长期稳定的合作关系。通过参与国际电子展会和交流活动,Advanced Analog的产品和技术得到了更广泛的认可和赞誉,进一步提升了公司在国际市场的知名度和影响力。

ATO SOLUTION公司的发展小趣事

面对日益激烈的市场竞争,ATO SOLUTION公司不断创新营销策略,提升品牌知名度和影响力。公司利用互联网和社交媒体等新媒体平台,开展线上宣传和推广活动;同时,还积极参加各类行业展会和论坛,与业界同行和潜在客户进行深入交流和合作。这些创新的营销策略有效地提升了公司的市场影响力,为公司的业务拓展提供了有力支持。

骏晔科技(DreamLNK)公司的发展小趣事

骏晔科技在无线通讯模块领域一直寻求创新。2019年,公司与硬之城达成战略合作,推出了高性能的FSK双向收发模块。这款模块采用了最新的FSK调制技术,极大地提高了数据传输的稳定性和效率。通过这一创新,骏晔科技在物联网设备通讯领域取得了显著的市场份额增长。

问答坊 | AI 解惑

怎样把VHDL或VERILOG 模块制作成IP 软核?

自己用Verilog编了一个程序,现在想将其制作成IP核。…

查看全部问答>

应用层怎么能得到驱动层的数据?(一个buffer)

就是驱动层得到的一个数据 怎么能复制到应用层去?…

查看全部问答>

美企招聘Platform engineer(SW 5#)

公司名称: Carrier Access 公司网址: http://www.carrieraccess.com 电子邮箱: lshi@carrieraccess.com,简历请注明信息出处 工作地点: 上海 外语要求: 英文良好 简历接收方式: 英文及中文 学历: 本科以上 职位描述: RESPONSIBILITIES: ...…

查看全部问答>

仔细想一想ARM芯片是不是单片机、

如题。 [ 本帖最后由 范小川 于 2010-8-31 21:54 编辑 ]…

查看全部问答>

大功率LED路灯\汽车灯的相关技术指标分析

大功率LED路灯顾名思义是大于30瓦以上,采用新型光源的路灯。目前LED路灯的标准一般是路面均匀度(uniformity of road suaceilluminance)的平均照度0.48。比值1:2,符合道路照度。(实际1/2中心光斑达到25LUX,1/4中心光强达到 15LUX,16米远的最 ...…

查看全部问答>

EE_FPGA 2.0之【焊接宝典】

Table of Contents 1. EE_FPGA 学习板板载资源简介 ........................................................................................... 42. EE_FPGA 学习板焊接必备的工具 ........................................................ ...…

查看全部问答>

模电学习

问题:为什么反馈网路的滞后环节和集成运放内部滞后环节相叠加易于满足自激振荡的条件?加C1电容为什么就可以消除振荡,C1电容是超前补偿呢,还是滞后补偿呢,为什么? C1电容与下面三个图中的电容性质一样吗?它们在位置上有许多相似的地方。 ...…

查看全部问答>

汽车佩带“电子身份证”已成新趋势

“如果还有人幻想用粘不干胶、贴塑料纸、抹机油的方式躲避电子眼,那么有了电子标签,一切都将沦为浮云。”互联网从业者黄小龙告诉记者,高峰期出行添堵,想要借用“大运专用道”的车友,也会因为电子车牌难以鱼目混珠。事实上,今年以来RFID(射频 ...…

查看全部问答>