32FFT 需移植arm的dsp库
开始是下载stm32的DSP库,提供一个下载地址:
链接:https://pan.baidu.com/s/1M28W7WXNsO3QVfkZunh7rg
提取码:s7kb
可以看到官方提供的是256点和1024点FFT,关于FFT的点数,我以前有个误区,以为点数和采样频率有关,看了相关资料后发现两者没有本质上的关系,但是点数影响测量的分辨率。
将DSP库移植到Keil工程里面:
原文链接:https://blog.csdn.net/weixin_43368814/article/details/103552114
主要用到的函数
void cr4_fft_256_stm32(void *pssOUT, void *pssIN, u16 Nbin);
void cr4_fft_1024_stm32(void *pssOUT, void *pssIN, u16 Nbin);
// *pssOUT是FFT之后输出频域的数组,*pssIN为输入的时域采样信号数组,Nbin为FFT点数
如需与信号频率对应则需要采样频率Fs 方法为用定时器触发ADC,再用DMA中般运
ADC由定时器角发DMA中断读取 改ADC数据内存为256 1024 等凑整的点数
奈重斯特采样定理。
开 AD C
定时器
PP
实部看频率虚部可以朋判断行相经
工程配置使用 ADC+DMA的历程为基础模板。
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1 工作在独立模式
ADC_InitStructure.ADC_ScanConvMode =DISABLE; //模数转换工作在非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode =DISABLE; //模数转换工作在不连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; //Timer1触发转换开启(定时器T1的CC1通道,控制采样频率)
Apc vaue地址
信号频率f0=(Fs/N)m ,信号幅值Vpp=val/(N/2)。N为FFT的点数,Fs为采样频率。如果还要求信号相位,则FFT运算后最大幅度对应的数组OutBufArray[]要转化成实部加虚部的形式:假设OutBufArray[m]=Num=a+b*i (i是虚部单位,a=Num/65536,b=Num%65536)。相位Pha=atan2(a, b),注意结果是弧度制。
以stm32f103 为例子 。定时器的采样频率由定时器分频系数和自动装载值确定,
假设ARR为71,PAC为9,定时器PWM频率f=72M/((ARR+1)(PSC+1)),ADC采样频率fs=f。
此实验中所用采样频率为100KHz,根据奈奎斯特采样定理可知,被测信号频率最大值要小于或等于采样频率的二分之一,因此被测信号频率最大值为50Khz。