STM32F4 DSP库学习笔记4-FFT基本函数使用一

  • barrettzxn
  • LV5工程师
  • |      2015-04-23 11:57:48
  • 浏览量 5758
  • 回复:4

【原创】STM32F4 DSP库学习笔记4-FFT基本函数使用一

前几次主要学习了一下概要。包括一些基本数学函数的使用。那么是时候学点有料的东西了。

DSP库,大家可能想到的用最多的就是FFT了。所以也就学习一下这些基本的fft函数。

首先使用的是ST的汇编的FFT库。STM32F10x_DSP_Lib。大家可以直接去网上下载。解压之后主要是以下几个文件

STM32F4 DSP库学习笔记4-FFT基本函数使用一

分别是64点,256点,1024点的FFT。然后把这个库添加到工程中来。

STM32F4 DSP库学习笔记4-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)

>> 

下图是运行结果

STM32F4 DSP库学习笔记4-FFT基本函数使用一

我们可以看到20Hz50Hz幅度明显比其他频率的对于幅度要高。

然后我们看看用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运行出来的结果频谱泄露比较严重。。。。。

运行结果如下:

STM32F4 DSP库学习笔记4-FFT基本函数使用一

那么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屏耍耍。STM32F4 DSP库学习笔记4-FFT基本函数使用一

最后再把那个库贴一下。


  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:4
barrettzxn 2015-04-23
当然开啦。不过还没进行那种复杂的运算,但是据他们说,挺快的
0   回复
举报
发布
Cigoy 2015-04-23

速度怎么样?

FPU开了没?

0   回复
举报
发布
barrettzxn 2015-04-23
裸机跑这个没有压力的呀。。
0   回复
举报
发布
Cigoy 2015-04-23
8错,有实际跑过,速度怎么样?
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子