FFT官方库的使用准备工作 其中,stm32_dsp.h和table_fft.h两个文件是必须添加的。stm32_dsp.h是STM32的DSP库的头文件。 进行256点的FFT,只需要调用STM32 DSP库函数中的cr4_fft_256_stm32()函数即可。该函数的原型为: - void cr4_fft_256_stm32(void *pssOUT, void *pssIN, uint16_t Nbin);
需要说明的是:按照FFT官方库的说明,pssOUT和pssIN都必须是32位的数据类型,其中高16位存储实部,低16位存储虚部。对于pssIN来说,低16位存储的虚部总是为0。 代码实例调用FFT官方库的代码为: - //填充数组
- for(i=0;i<NPT;i++)
- //这里因为单片机的ADC只能测正的电压 所以需要前级加直流偏执
- //加入直流偏执后,需要在软件上减去2048即一半,达到负半周期测量的目的(需要根据具体情况来进行配置)
- lBufInArray[i] = ((signed short)(adc_buf[i]-2048)) << 16;
-
- cr4_fft_256_stm32(lBufOutArray, lBufInArray, NPT);
同时,计算各次谐波幅值的函数为:
- void GetPowerMag()
- {
- signed short lX,lY;
- float X,Y,Mag;
- unsigned short i;
- for(i=0; i<NPT/2; i++)
- {
- lX = (lBufOutArray[i] << 16) >> 16;
- lY = (lBufOutArray[i] >> 16);
-
- //除以32768再乘65536是为了符合浮点数计算规律
- X = NPT * ((float)lX) / 32768;
- Y = NPT * ((float)lY) / 32768;
- Mag = sqrt(X * X + Y * Y) / NPT;
- if(i == 0)
- lBufMagArray[i] = (unsigned long)(Mag * 32768);
- else
- lBufMagArray[i] = (unsigned long)(Mag * 65536);
- }
- }
|