【原创】STM32F4 DSP库学习笔记4-FFT基本函数使用一
前几次主要学习了一下概要。包括一些基本数学函数的使用。那么是时候学点有料的东西了。
用DSP库,大家可能想到的用最多的就是FFT了。所以也就学习一下这些基本的fft函数。
首先使用的是ST的汇编的FFT库。STM32F10x_DSP_Lib。大家可以直接去网上下载。解压之后主要是以下几个文件
分别是64点,256点,1024点的FFT。然后把这个库添加到工程中来。
最后在stm32_dsp.h文件的stm32f1的头文件换成stm32f4的头文件
然后就可以用了。
然后我们只要是用一下这个cr4_fft_1024_stm32();这个函数。因为1024点我们用的相对较多。
在stm32_dsp.h中是这样声明的。
void cr4_fft_1024_stm32(void *pssOUT, void *pssIN, uint16_t Nbin);
一个输出指针。一个输入指针。一个点数。
有必要说明一下的是。输出的数据是32位的,高16位存的是实部,低16位存的是虚部。
下面两个函数就是求1024点的FFT,并求出幅频相应。(程序是借鉴别人的)。
void PowerMag(uint16_t _usFFTPoints)
{
int16_t lX,lY;
uint16_t i;
float32_t mag;
for (i=0; i < _usFFTPoints; i++)
{
lX= (output<<16)>>16;
lY= (output>> 16);
mag = __sqrtf(lX*lX+ lY*lY);
Mag= mag*2;
}
Mag = Mag>>1;
}
void DSP_FFT1024(void)
{
uint16_t i;
for (i = 0; i < 1024; i++)
{
input = 0;
input = 1024 + 1024*sin(2*3.1415926f*50*i/1000) + 512*sin(2*3.1415926f*20*i/1000) ;
}
cr4_fft_1024_stm32(output, input, 1024);
PowerMag(1024);
for (i = 0; i < 1024; i++)
{
printf("%drn", input);
}
}
然后我们把打印出来的数据导入到MATLAB.在这里从这个函数中看出来
for (i = 0; i < 1024; i++)
{
input = 0;
input = 1024 + 1024*sin(2*3.1415926f*50*i/1000) + 512*sin(2*3.1415926f*20*i/1000) ;
}采样率是1000;采了1024个点。
所以为了更好的看出每个频率点的幅度,我们这样写。
>> fs=1000;
>> N=1024;
>> n=0:1:N-1;
>> f=fs*n/N;
>> plot(f,data)
>>
下图是运行结果
我们可以看到20Hz和50Hz幅度明显比其他频率的对于幅度要高。
然后我们看看用MATLAB模拟做FFT效果又是如何:
>> fs=1000;
>> N=1024;
>> n=0:1:N-1;
>> f=fs*n/N;
>> t=0:1/fs:1-1/fs;
>> x = 1024 + 1024*sin(2*pi*50*t) + 512*sin(2*pi*20*t) ;
>> y=fft(x,N);
>> plot(f,abs(y)*2/N)
运行结果如下,两者还是差不多的,只是感觉stm32运行出来的结果频谱泄露比较严重。。。。。
运行结果如下:
那么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);一样,只是运算点数不一样,大家也可以去试试效果。不用说效果肯定没有1024点好,肯定是点数越少越差。
差不多知道这个函数怎么用之后,就可以做点好玩的了,比如分析音频信号的频谱变化,然后做一下LED屏耍耍。
最后再把那个库贴一下。
速度怎么样?
FPU开了没?