赞
踩
网络上有很多关于FFT的资料,做一个总结。
1.STM32F103官方提供的FFT是一种基4的FFT,即能做的傅里叶点数必须是4的幂,也就是64,256,1024等,不支持128,512点的FFT;
从库的名字上就看的出支持的点数:cr4_fft_64_stm32,cr4_fft_256_stm32,cr4_fft_1024_stm32;
/* Radix-4 complex FFT for STM32, in assembly */
void cr4_fft_64_stm32(void *pssOUT, void *pssIN, uint16_t Nbin);
void cr4_fft_256_stm32(void *pssOUT, void *pssIN, uint16_t Nbin);
void cr4_fft_1024_stm32(void *pssOUT, void *pssIN, uint16_t Nbin);
2.该库是一个16bit的定点FFT,根据手册说明,pssOUT和pssIN为32bit的整型数组,高16位是时域的实数,低16位的是时域的虚数,通常情况下,令虚数部分为0;
因此,ADC采样后的数据或者是其它的输入数据,需要做如下处理:
adc_value = (adc_value<<16);
或
adc_value = (adc_value<<16)&0xffff0000;
3.FFT的输出是一个复数,根据手册说明,高16位是频域的实数,低16位的是频域的虚数;计算每个频点的赋值如下:
for (i=0; i<FFT_SIZE/2;++i) {
real = pssOUT[i] >> 16;
img = pssOUT[i]&0xffff0000;
value[i] = sqrt(real *real +img*img);
}
pssOUT是一组除了直流信号(pssOUT[0])关于内奎斯特频率(采样率的一半)点中心对称(共轭复数)的数据,因此上述计算只需要计算一半即可,为了计算精度,另外一半也可以参与计算。
假设采样率fs=16K,采样点256点,则频率分辨率为16000/256,即 0,62.5,125,187.5,250,......,8000, 7937.5,.......,250,187.5,125,62.5;其中62.5,125,187.5,250,......,8000,7937.5,.......,250,187.5,125,62.5关于8000中心对称;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。