|
楼主 |
发表于 2019-6-18 18:44:54
|
显示全部楼层
本帖最后由 csaaa 于 2019-6-18 18:51 编辑
这个说来话长了,那一堆公式画上去有点让人觉得故弄玄虚吧。实际制作的时候是采用了ST公司提供的DSP库来处理的,因为这个库是经过大量优化的,速度极快,否则很难保证实时性。
关于FFT的算法其实一搜一大堆啦。
这是我的FFT部分代码
void powerMag()
{ int32_t lX,lY;
uint32_t i;
for (i=0; i < NPT/2; i++)
{
lX= (lBUFOUT1<<16)>>16; /* sine_cosine --> cos */
lY= (lBUFOUT1 >> 16); /* sine_cosine --> sin */
{
float X= NPT*((float)lX)/32768;
float Y = NPT*((float)lY)/32768;
float Mag = sqrt(X*X+ Y*Y)/NPT; // 先平方和,再开方
//Mag-=0.000001;
if (Mag<filterlevel) Mag*=0.5;
if (i==0)
lBUFMAG1 = (uint32_t)(Mag*16384); //直流分量/2
// else if(i<5)
// lBUFMAG = (long)(Mag*16384); //减弱低频
else
lBUFMAG1 = (uint32_t)(Mag*65535); //此处倍数可控制幅度
lBUFMAG1>>=3; //有放大器 值除以16
if (lBUFMAG1>SEGNUM) lBUFMAG1=SEGNUM; //限幅
//关于噪声门限
}
}
}
main(){
...
cr4_fft_64_stm32(lBUFOUT1,lBUFIN1,NPT);//调用DSP库作FFT变换
powerMag();//计算频点幅值 结果是对称的,计算前一半即可
} |
|