stm32F103RCT6使用FFT运算分析波形详解(非常新手) 您所在的位置:网站首页 FFT原理详解 stm32F103RCT6使用FFT运算分析波形详解(非常新手)

stm32F103RCT6使用FFT运算分析波形详解(非常新手)

2024-01-04 00:10| 来源: 网络整理| 查看: 265

最近学校电赛院队招新,出的招新题就是低频示波器的。之前一直没有弄懂FFT,借着这次机会实现了一下。

FFT原理详解

  FFT,就是快速傅里叶变换,这个操作能够将时域信号转化成频域信号,然后对信号进行分析

  这样说可能有点抽象。讲细点就是指能够直观的看出来目标信号的频率是多少。x轴坐标本来是表示时间,FFT之后变成了表示频率,就是这个意思

  对于信号处理,FFT之后的结果,波峰一般会出现在我们希望测得信号的频率附近(十分相近)

官方文件解释

stm32官方给了几个用于处理FFT的文件,如图所示:

 

 

 其中有两个汇编文件两个头文件:汇编文件是定义了FFT的计算函数,我们直接调用即可

cr4_fft_1024_stm32.s是包含了计算1024个点的FFT的函数的汇编文件,另一个汇编文件同理

stm32_dsp.h里面有关于FFT处理函数的声明,我们包含了这个头文件之后直接调用函数即可

补充:stm32_dsp.h当中有一个include的头文件,需要根据情况进行修改,比如说用其他型号板子或者其他库开发的记得要修改,不然编译时会报错

算法解释 1 //进行FFT运算等操作 2 void FFT_Wave(void) 3 { 4 u16 i; 5 float mid_value; 6 while(!ADC_flag) 7 { 8 LED1 = !LED1; 9 delay_ms(100); 10 } 11 ADC_flag = 0; 12 13 //获取最大值最小值 14 adc_value_max = adc_value_min = ADC_buff[1]; 15 for(i = 0;i < NPT;i++) 16 { 17 //寻找最大值最小值 18 if(ADC_buff[i] >= adc_value_max) 19 { 20 adc_value_max = ADC_buff[i]; 21 } 22 if(ADC_buff[i] 16; 9 lY = (fftout[i] >> 16); 10 float X = 1024 * ((float)lX) / 32768; 11 float Y = 1024 * ((float)lY) / 32768; 12 float mag = sqrt(X * X + Y * Y) / 1024; 13 FFT_Mag[i] = (u32)(mag * 65536); 14 } 15 FFT_Mag[0] >>= 1;//频谱图第一个是直流分量,无需乘2 16 for(int i = 0;i < NPT / 2;i++) 17 { 18 if((maxmag < FFT_Mag[i]) && (i != 0)) 19 { 20 maxmag = FFT_Mag[i]; 21 temp = i; 22 } 23 } 24 F_hz = temp * sampling_rate / 1024.0; 25 }

至此,我们就得到了我们所需信号的频率

鉴于本小白能力有限,如果有纰漏或改进之处,欢迎指正

特别提醒:ADC采样率应遵循奈奎斯特采样定理!采样率不是越高越好!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有