1、STM32有dsp库,百度一堆的文章,注意有f4有硬件fft可以使用arm_rfft_fast_init_f32,F1不能使用,F1可以使用arm_cfft_radix4_init_f32,256长度1024长度,arm_cfft_radix2_init_f32 512长度。 2、采样率FFT_SampleRate = SystemCoreClock/((__HAL_TIM_GET_AUTORELOAD(&htim3)+1)72); //采样波形为23hz~1.8k,采样512个点,(一周期最少采20个点,一组采样大于10个周期) //采样率=1.8k20=36k 36kHz512=14ms 1k-1.8k //采样率=1k20=20k 20kHz512=25.6ms 400-1k //采样率=40020=8k 8kHz512=64ms 200-400 //采样率=20020=4k 4kHz*512=128ms 10-200 修改采样率定律,使用那个谁的定律大于2被的采样频率。实际上需要计算n的值需要在2-(N/2-1)之间就可以,这个使用仿真方法最为快速,LV有模块直接用,图在最后。22-1600hz的采样率为6000hz,可以覆盖所有的频段。 3、后面就是最核心的 //调用复数傅里叶变换 arm_cfft_radix2_f32(scfft1,fft1->fft_input); //计算FFT幅度值 arm_cmplx_mag_f32(fft1->fft_input,fft1->fft_output,FFT_LENGTH); //找到最大幅度值以及其对应的数组位置(下标) arm_max_f32(fft1->fft_output,FFT_LENGTH,maxValue,testIndex); 4、计算下标及对应的频率 Fn 所能分辨到频率为 Fs/N,如果采样频率 Fs 为 1024Hz,采样点数为 1024 点,则可以分辨到 1Hz。
峰值频率=区间索引*(FS/N)
输入波形:1.2farm_sin_f32(23.1415926f1000i/FFT_SampleRate)+1; 521为n=0时的值 直流分量为: 512/N=521/512=1;// 1000Hz 信号的幅度(rms)为:254/(N/2)=254/(512/2)=0.99*1.414=1.4;//不是很准 5,后面遇到再记录
|