在AD采样通过FFT算幅值和角度不对 - 测试/测量 - 电子工程世界-论坛 (eeworld.com.cn)帖子中,算的相位与幅值不对。又从网上找了找例程,用网上的方法重新做了一遍,相位依然不对,而且出现个新问题。
每周波20ms采64个点,定义的输入数组、输出数组、各次谐波数组如下:
int32_t lBUFIN[64]; //NPT=64
int32_t lBUFOUT[32]; //输出数组是采样输入的一半
int16_t lx,ly; //过度变量
float X,Y,Mag; //虚部 实部 谐波临时存储变量
uint32_t lBufMagArray[32]; //最后算出来的谐波值数组 也是32个
for (i = 0; i < 64; i++)
{
lBUFIN[i] = (sample[channel].AI0[b0]<<16); //channel是AD通道序号
}
cr4_fft_64_stm32(lBUFOUT,lBUFIN,64); //总是在这一步进入硬件错误中断,屏蔽此处正常
for (i = 0;i <= (64 >> 1);i ++)
{
lx = (lBUFOUT[i] << 16) >> 16;
ly = (lBUFOUT[i] >> 16);
X = 64 * ((float)lx) / 32768;
Y = 64 * ((float)ly) / 32768;
Mag = sqrt(X * X + Y * Y) / 64;
if(i == 0)
lBufMagArray[i] = (unsigned long)(Mag * 32768); //0次,即直流分量
else
lBufMagArray[i] = (unsigned long)(Mag * 65536); //1,2,3,4等谐波幅值 其中1次谐波是50hz,是正弦波的基波,认为近似等于输入正弦波幅值
if(i==1)
{
MYData.Forier[f_type].phase=(atan2(X,Y) * 180.00 / PI); //在1次谐波50hz下,算相位
}
}
现在问题是:
(1)相位依然在乱变,大致看上去互相差120度,但一直(-118,127),(-109,-248),(113,246)(111,-249),基本就是这种没有规律的乱变
(2)输出数组数量如果定义为int32_t lBUFOUT[32]; 一旦运行到cr4_fft_64_stm32(lBUFOUT,lBUFIN,64); 就进入硬件错误中断。将lBUFOUT[32]改为lBUFOUT[64]就没事。但网上我看都是输出数组大小是输入数组的一半。这是哪有问题。
|