stm32f103求一个高效率的fft算法测频

stm32f103求一个高效率的fft算法测频,官方库的fft速度太慢占用内存
要求:测量频率范围0~100hz,分频率达到0.1hz

MATLAB有自带的函数,abs(fft(data-mean(data))),然后生成C代码移植到单片机


void InitBufInArray()
{
unsigned short i;
float fx;
for(i=0; i<NPT; i++)
fx=1500*sin(PI2*i*/Fs)+
2700*sin(PI2*i*/Fs)+
4000 * sin(PI2* i * / Fs);
BufInArray[i] = ((signed short)fx) << 16;
}

影响计算速度的最主要因素就是"FFT计算点的数量",有效的降低这个值才能提高计算速度。
FFT 测量频率分辨率= (采样频率)/(计算点的数量)
计算点的数量必须是 2 的指数次方,比如256,1024
采样频率最低要求是测量频率的2倍(当然越大越好)
这样计算,最低要求,最快的速度的参数如下:
采用频率用 204.8Hz
计算点的数量2048个
FFT 测量频率分辨率= 204.8/2048=0.1Hz
你需要和硬件工程师协商确定一个最合适的"采样频率"这个频率也最好是 2 的指数次方(方便计算)
当然如果降低需要,比如分辨率为 1Hz 计算点的数量就可以用256,这样就极大的提高了速度。
也可以用抽值算法,通过软件的方法把采样频率降低。

使用STM32提供的DSP库进行FFT(附详细代码)
https://blog.csdn.net/qq_38410730/article/details/90116695

官方库的fft可以调整参数,试过没?

FFT算法已经是很优化的算法了,在基本算法上没什么可优化的,只能试试根据具体需要调整一下参数,比如采样频率,计算点数。

这个文章符合你的需求

优化已经达到天花板,除非另辟蹊径

fft算法之前用过,给朋友个参考吧。根据采样定理,采样频率必须是被采样信号最高频率的2倍。我们之前要采集的是音频信号,音频信号的频率范围是20Hz到20KHz,所以我使用的采用频率是44800Hz。那么在进行256点FFT时,将得到44800Hz / 256= 175Hz的频率分辨率。
代码如下:
void InitBuflnArray()

unsigned short i;
float fx;
for (i= 0; i<NPT; i++)

fx=
1500 * sin(Pl2 *i *350.0/Fs) +2700 * sin(PI2 j8400.0/Fs) +4000 * sin(PI2 j18725.0/ Fs);

IBuflnArray[i] = ((signed short )fx)<< 16;


朋友可以看到,代码中NPT是采样点数256,P|2 是2π (即 6.28318530717959),Fs 是采样频率44800。可以看到采样数据中包含了3种频率的正弦波,分别为350Hz,8400Hz和18725Hz。
望采纳谢谢啦