聊聊FFT(三)----基于Cortex M4官方DSP库的使用

Cortex M4早期的DSP库对FFT计算步骤比较复杂,首先要初始化结构体,还要分基2或基4,样本数不同采用的函数也不同;步骤如下:

arm_cfft_radix4_instance_f32scfft;//声明一个结构体scfft 
arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);//初始化scfft结构体,设定FFT相关参数.这些参数存储在结构体scfft里面; 
arm_cfft_radix2_f32(&scfft,fft_inputbuf);//基2,样本数为256,512,1024等;
arm_cfft_radix4_f32(&scfft,fft_inputbuf);//基4,样本数为256,1024,4096等;

不过新的DSP库没这么复杂,只要调用一个函数初始化即可,而且不用区分基2还是基4:

arm_cfft_f32(&arm_cfft_sR_f32_len1024,fft_inputbuf,0,1); 

   len1024表示眼样本数为1024,fft_inputbuf为输入数组,及要进行FFT的对象,里面按实部、虚部进行填充:

for(i=0;i<FFT_LENGTH;i++)
 {
  fft_inputbuf[2*i+1]=0;//虚部全部为0
  fft_inputbuf[2*i]=Data[i];//实部填充原始数组Data;
 }

以上初始化的一些步骤处理完后就进入最核心的FFT计算了,调用:

 arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);

 三个参数解释一下:

 fft_inputbuf,表示上文说的输入数组,但是也作为输出数组,储存的是相位信息;

 fft_outputbuf,表示的是输出数组,存储的是频率和模值信息;

 FFT_LENGTH,表示样本数,如1024;

  进行完该函数运算后,便可以得到一堆信息了。如果采样率为10240HZ,样本数为1024,则FFT 分辨率为10,fft_outputbuf[1024]内存储的是以10HZ为步进表示的模值,比较拗口,举个例子形象一点:

fft_outputbuf[0]=0;//表示0hz,即直流分量对应的模值;

fft_outputbuf[1]=11;//表示10hz对应的模值;

fft_outputbuf[2]=12;//表示20hz对应的模值;

fft_outputbuf[3]=13;//表示30hz对应的模值;

.................

fft_outputbuf[5]=120;//表示50hz对应的模值; 

fft_outputbuf[10]=8;//表示100hz对应的模值;

不同频率对应的模值计算出来了,幅值也就计算出来了,信号的成分就出来了;

 相位比较麻烦一点;

   for(i=1;i<FFT_LENGTH;i++)
   {
      realValue=fft_inputbuf[2*i];
      imageValue=fft_inputbuf[2*i+1];
      fft_Phasebuf[i]=atan2f(imageValue,realValue);
    }

首先要把FFT计算后,fft_inputbuf[ ]数组内的虚部和实部提取出来,再通过反切函数进行计算,存到 fft_Phasebuf[ ]数组里;      

 fft_Phasebuf[0]=0;//表示0hz,即直流分量对应的相位;

 fft_Phasebuf[1]=1.51;//表示10hz对应的相位;

 fft_Phasebuf[2]=2.21;//表示20hz对应的相位;

 fft_Phasebuf[3]=0.83;//表示30hz对应的相位;

  .................

 fft_Phasebuf[5]=2.35;//表示50hz对应的相位; 

 fft_Phasebuf[10]=1.62;//表示100hz对应的相位;

这个数字要乘以180再除以π才是角度值,如50HZ对应的实际相位为2.35*180/3.14=134.71°;

  需要注意的事项:

  要非常精确的设定采样频率、采样数,既要保证FFT分辨率是整数,而且还能被原始模拟信号频率整除,还要保证采样数对应的采样时间是原始模拟信号周期整数倍,否则FFT会出现频谱泄漏、输出结果不准确等问题;

   当然由于各种误差的原因,实际也有可能难以保证采样频率与采样数的苛刻要求,那么就要对输入数组进行加窗处理,如矩形窗、汉宁窗,加窗可以强制性将输入数组转换为FFT认可的规划格式,最大限度平滑频谱泄漏导致的波形失真问题,但是仍然无法完全解决频谱泄漏,毕竟强扭的瓜不甜嘛。

  • 10
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值