0.前言
我是新手。 最近需要使用fft,所以就学会了使用。 这很有趣。 文章内容可能存在描述不准确或错误。 希望读者用辩证的眼光来阅读。 如果方便指出错误,那就非常感谢了。
本文主要关注fft的实际应用。 没有设计如何实现fft和原理部分,因为我不知道怎么实现,哈哈哈。
一、原理:
FFT后的物理意义_神马观智-CSDN博客_fft的含义
CMSIS DSP库手册下载地址(F4):
DSP库API手册:
CMSIS DSP(arm-..io)
2.为什么需要fft? 非常方便分解信号和测量谐波来测量波形频率和幅度,且精度更高。 3.什么是fft?
快速傅里叶算法,(DFT的快速算法),可以将周期信号从时域分解到频域
4、如何使用?
使用fft时需要了解几个概念:
(1)FFT参数
频谱分辨率:Fs/N Fs:采样频率 N:fft 采样点数
因此,需要通过降低采样频率、增加fft点数来提高精度。
谱宽:Fs/2/kk:下采样率
(2)如何计算频率和幅度
如果进行4096点FFT运算
频率:数据输出4096点。 ,第一个点代表0hz信号的幅度,即直流分量,后续点的频率=点数*分辨率。 fft输出是对称的,因此≥N/2的点没有实际意义。
幅度:直流分量/N,谐波分量/(N/2)。
五、方案实施
方案思路:
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);
直接使用官方库的例子在下载的库目录下:
.8.0//CMSIS//DSP/html/-.html