dsPIC33EP128GP502运行FFT检测输入主频始终输出0问题求助
问题排查点(按出现概率从高到低排序)
- 未跳过直流分量所在的0号FFT bin
你当前调用VectorMax时直接从下标0开始搜索最大值,0号bin对应直流分量,只要输入信号存在直流偏移(单端ADC输入场景下几乎必然存在),直流分量的幅值会远大于交流信号幅值,peakFrequencyBin永远返回0,最终计算得到的peakFrequency自然始终为0。
修正方法:将VectorMax的搜索起始地址改为&sigCmpx[1].real,搜索长度改为FFT_BLOCK_LENGTH/2 - 1,频率计算时记得将返回的peakFrequencyBin加1再乘以频率分辨率。 - FFT定点运算缩放导致交流分量幅值被淹没
dsPIC的DSP库FFTComplexIP为了防止定点溢出,每级蝶形运算会自动右移1位做缩放,10级FFT(2^10)会整体缩放1/1024。如果你的输入交流信号幅值较小,经过缩放+平方运算后,交流bin的幅值可能低于识别阈值,或者仍然远小于直流bin。
修正方法:输入信号增加前级运放放大幅值,或者在平方运算后对幅值做左移补偿缩放比例(注意防止溢出)。 - ADC采样数据未隔直
你当前直接将ADC采样值送入FFT,没有做直流分量消除处理。可以在采样后对所有采样点求平均值,再将每个采样点减去平均值,消除直流偏移后再做FFT运算。 - ADC输入信号电平不匹配
你配置ADC输出为有符号小数,说明你使用的是差分输入模式或者单端输入加直流偏置。如果你输入的单音信号是双极性的,没有做电平抬升适配单端ADC的输入范围,会导致负半周被削波,有效交流分量幅值极低,无法被识别。 - 旋转因子初始化参数错误
检查TwidFactorInit第三个参数,dsPIC DSP库中该参数为0时生成正变换(FFT)所需的旋转因子,为1时生成逆变换(IFFT)所需的旋转因子,你当前配置为0是正确的,但如果你的DSP库版本不同可能定义相反,可以核对头文件中的函数说明。 - 采样时序偏差
你当前的采样逻辑是等待TMR1中断后再软件触发ADC转换,会引入中断响应延迟和软件触发的额外开销,实际采样率会低于预期的192042Hz,虽然不会导致输出始终为0,但会影响频率测量精度。建议修改为TMR1硬件直接触发ADC采样,不需要经过中断中转。
内容的提问来源于stack exchange,提问作者Henrik-Wo
相关产品推荐
相关产品推荐

