STM32-FFT代码说明_第1页
STM32-FFT代码说明_第2页
STM32-FFT代码说明_第3页
STM32-FFT代码说明_第4页
STM32-FFT代码说明_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、FFT代码说明FFT 为 Fast Four ier Transformation,即快速傅 里叶变换,本项目中,FFT的目标是识别频率为形如式 (1. 1)的一个正弦信号:/(x) = A sin(2 ft)(1 1)其中,/ = 21Hz5%;因为单片机通过ADC接口读取 该正弦信号的电压值,而12位精度的ADC的值范围在 0-4096之间,如信号经过放大器后映射到0-33V之间, 则振幅A的取值0-4096之间。假设,信号经过放大器后,其电压值最大为3. 3V, 最小为0V,则此信号的振幅为1.65V,对应A二2048, 即该信号为:/(x) = 2048 + 2048 sin(2x 2

2、1 r)(1 2)本文中给出的例程即通过FFT识别式(12)这种正 弦信号。假设采样频率为Fs,信号频率Fn,采样点数为N。那么FFT之后结果就是一 个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值 下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A, 那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。 而第一个点就是直流分量,它的模值就是直流分量的N倍。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这 个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半 分,另一半移到最后)则表示采

3、样频率Fs,这中间被NJ个点平均分成N等份, 每个点的频率依次增加。例如某点n所表示的频率为:Fn = (n-)* Fs/N(1.3)频率分辨率(纣= Fk/N )等于采样时间的倒数。例如要分辨0.1Hz,则需要 采集10so1 基于STM32官方DSP库的FFT算法工程文件中包含三个函数库,分别为:c r4_fft_64_st m 3 2 sc r56_s t m 3 2 scr4_fft_1024_stm32.s分别对应数据点数为64,256和1024时的FFT算法。下面将以数据点数是1024 为例,说明FFT的实现过程。通过函数生成原始数据for(i=0;iNPT;i+)Fx=2048+

4、2048*sin(PI2*i*21/Fs+20)+1000*sin(PI2*i*15/Fs)+100*sin(PI2*i*25/Fs)+rand()%100; 振幅2048,频率21HZ,为主要的谐波分量,21HZ也是所需 信号的频率,rand()%100为0-100之间的随机噪声IBUFINi = (sl6)fx)16;高位为实部,低位为虚部Fs为采样频率,此处设为102.4Hz, NPT为数据长度(即前文中提到的N ),为 了能够分辨0.1Hz,数据长度NPT设为1024,则频率分辨率=102.4/1024=0.1Hzo12对原始数据进行FFTSTM32库中给出的FFT函数格式如下:Voi

5、d cr4_fft_1024_stm32(lBUFOU7; IBUFIN, NPT);其中,NPT为数据点个数,通过修改宏定义来修改NPT代表的值,此处为1024;LBUFOUTNPT和LBUFINNPT均是长度为NPT的32位长整型的数组,高6位为 实部,低16位为虚部,LBUFOUTNPT用于保存FFT之后的输出值;LBUFINNPT 用于保存输入的数值。对原始数据进行FFT之后,需要对输岀数据进行处理。1.2.1频率计算每个频率点处代表的真实频率为for(i=0;iNPT/2;i+)Fn=i*Fs/NPT 由于此处i是从0开始的,所以不需要再减112.2幅值计算经过FFT后,每个频率点处

6、的真实幅值的计算公式如下。(1.4)X = ”$(LBUFOUT0) / NA =。加(LBUFOUTi) x2/Ni H 0void dsp_asm_powerMag(void)S16 IX,IY;u32 i;for(i=0;iNPT/2;i+) 山于FFT的频谱结果是关于奈奎斯特频率对称的, 所以只计算一半的点即可IX =(lBUFOUTi 16) 16; 取低 16 位,虚部IY =(IBUFOUTi 16);取高 16 位,实部float X = NPT* (float)IX) /32768;float Y = NPT* (float)lY) /32768;float Mag = sq

7、rt(X*X + Y*Y)/NPT;IBUFMAGi = (u32)(Mag * 65536);真实振幅 lBUFMAGi二 sqrt(IX*IX+lY*lY)*2/NPT,先除以 3276& 又乘以65536是为了符合浮点数的计算规律IBUFMAGO= IBUFMAG0/2;/直流分量不需要乘以2,所以按照乘以2汁算后,要除以2得到每个频率点所代表的真实频率Fn,以及该真实频率所代表的原始信号的 振幅A,将其通过串口打印到电脑上。for(i=0;iNPT/2;i+)printf(H%4d, %.2f %10dn,i,(float)i*Fs/NPT),IBUFMAGi); 结果如下图所示。n友

8、茎=匚遁试妙手文件(F)S(E) 貓(V) jLM(T)辛初(H)图1 f=Ohz处幅值图2f=15Hz处幅值图3 f=21hz处幅值图4 f=25hz处幅值2 非官方FFT算法另外程序中给出了非官方FFT it算方法,文件名为FFT2.C,相关的函数如下:dsp_g2_init(); 用于生成计算所需原始数据,dsp_g2_test(); 非 STM32 库中的 FFT 算法pri ntf_d s p_g 2_M ag ();/将各个频率点上的振幅打印到电脑上timetest_g2FFT(); 通过定时器测试该FFT算法消耗的时间,包括计算各个频 率点的振幅汁算时间非官方的FFT算法的讣算结果详见诽官方FFT结果.txt附件3 耗时测试通过配置TIM6定时器进行计时,单位为ms。对官方FFT算法以及非官方FFT 算法进行了耗时测试,测试10次FFT总时间,求取平均值,其中包括计算各个频 率点幅

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论