概述
0.前言
我是个小菜鸡,最近需要用fft,就学习使用了一下,感觉还挺好玩的,文章内容可能有描述不准确或者错误的地方,希望读者带着辩证的眼光阅读,如果方便指出错误,那就很感谢了。
本文主要关注fft实际应用,对于如何实现fft,和原理部分没有设计,因为我不会,哈哈哈。
1.原理:
FFT后的物理意义_神马观止-CSDN博客_fft的意义
CMSIS的DSP库手册下载地址(F4):
STSW-STM32065 - STM32F4 DSP and standard peripherals library - STMicroelectronics
DSP库API手册:
CMSIS DSP Software Library (arm-software.github.io)
2.为什么需要fft?
- 分解信号,测谐波
- 测波形频率和幅值很方便,精度也更高
3.什么是fft?
快速傅里叶算法,(DFT的快速算法),可以把周期信号从时域分解到频域
4.怎么用?
使用fft时有几个概念需要了解:
(1)FFT参数
频谱的分辨率:Fs/N Fs:采样频率 N:fft采样点数
所以需要提高精度,可以降低采样频率和提高fft点数。
频谱宽度:Fs/2/k k:降采样率
(2)怎么算频率和幅值
如果进行4096点FFT运算的话
频率:数据输出4096个点。,第一个点代表0hz信号的幅值,也就是直流分量,后面的点的频率=点数*分辨率。fft输出是对称的,所以≥N/2的点都没有实际意义。
幅值:直流分量/N,谐波分量/(N/2)。
5.stm32f4程序实现
程序思路:
TIM2(TRGO信号)触发 ——> ADC采样(开启DMA传输) ——> FFT运算、和数据处理(在DMA传输完成中断中)
TIM2触发是为了精准控制adc采样频率。这里有一个信号同步的问题,就是可能分辨率与采样的信号不能准确的对应上(比如采样频率是1khz,然后分辨率是9hz,1000/9不是整数。这样在频谱图上就没有一个整数点能对应1khz,然后数据就会没那么准确),这个好像就是叫频谱泄露
ADC采集应该都会吧。。。要注意adc采集f>tim2触发f(更新中断),不然可能会出问题。
FFT运算
/* Process the data through the CFFT/CIFFT module */
arm_cfft_f32(&arm_cfft_sR_f32_len4096, fft_Input_f32, ifftFlag, doBitReverse);
/* Process the data through the Complex Magnitude Module forcalculating the magnitude at each bin */
arm_cmplx_mag_f32(fft_Input_f32, fft_Output, fftSize);
/* Calculates maxValue and returns corresponding BIN value */
arm_max_f32(fft_Output, fftSize, &maxValue, &maxIndex);
直接使用的官方库的例子,在下载好的库的这个目录下:
STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Documentation/DSP/html/arm_fft_bin_example_f32_8c-example.html
最后
以上就是繁荣绿草为你收集整理的stm32f4进行fft运算0.前言1.原理:2.为什么需要fft?3.什么是fft?4.怎么用?5.stm32f4程序实现的全部内容,希望文章能够帮你解决stm32f4进行fft运算0.前言1.原理:2.为什么需要fft?3.什么是fft?4.怎么用?5.stm32f4程序实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复