按照资料给的公式,采用比值校正,频率误差很大,看了别人matlab文件,问题应该出在不是使用 fft_outputbuf比值校正,请教使用什么数值校正。
[C] 纯文本查看 复制代码 void FFT()
{
if(ADCConvEnd_FLAG==1)
{
ADCConvEnd_FLAG = 0;
for(int i=0;i<FFT_LENGTH;i++)
{
fft_inputbuf[2*i] = ((ADC_Value[4*i]) * 100 * 3.3 / 4096) * hanning_window[i];
fft_inputbuf[2*i+1] = 0; //虚部全部为0
}
arm_cfft_f32(&arm_cfft_sR_f32_len256,fft_inputbuf,0,1);
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //把运算结果复数求模得幅值
arm_max_f32(fft_outputbuf,FFT_LENGTH/2,&max,&maxnum);
if(fft_outputbuf[maxnum+1] > fft_outputbuf[maxnum-1])
{
dK = (2 * fft_outputbuf[maxnum+1] - fft_outputbuf[maxnum]) / ( fft_outputbuf[maxnum+1] + fft_outputbuf[maxnum]) ;
}
else
{
dK = (fft_outputbuf[maxnum] - 2 * fft_outputbuf[maxnum-1]) / ( fft_outputbuf[maxnum] + fft_outputbuf[maxnum-1]) ;
}
fre=(1.0 * Fs * (maxnum + dK) ) / FFT_LENGTH;
}
}
|