STM32的FFT库,计算幅值与相角不对 今天用STM32提供的FFT库2.0版,计算了一下,发现算出的相角、幅值均不对。 测试方法是: 使用Sin函数模拟产生出一个正玄波,用FFT计算这个正玄波的幅值与相角。 为测试FFT的准确性,产生的正玄波分别有相同的幅值和不同的初相,两个相邻的波形初相差为 2PI / 64 弧度。 测试后发现: STM32计算出的幅值、相位均有极大的误差。 其中,幅值上的错误是:幅值数值上与理论值误差极大,而且随着初相的不同,竟然会随着变化。 相位上的错误是:计算出的相角与理论误差也极大,而且在除相差恒定的情况下,实际计算出的出相差是变化的。 是否有对STM32的FFT库更了解的高手,帮忙分析下造成以上错误的原因。 测试程序如下: static void FFT(void) { u8 arnSample[64]; u32 arnInBuf[64], arnOutBuf[64]; s16 nFftReal, nFFtImage; // 分别用于存储64个初相时的实部、虚部、幅值、相角 float fReal[64], fImage[64], fValue[64], fAngle[64]; s32 nReal[64], nImage[64], nValue[64], nAngle[64]; u16 i = 0, nPhase; for (nPhase = 0; nPhase < 64; nPhase++) { for (i = 0; i < 64; i++) // 产生各初相时的曲线 arnSample = (s16)(1000 * sin(2 * 3. * (i + nPhase) / 64)); for (i = 0; i < 64; i++) // 准备FFT输入 arnInBuf = (arnSample << 16); cr4_fft_64_stm32(arnOutBuf, arnInBuf, 64); //FFT计算 // 取基波的实部、虚部 nFftReal= (s16)((arnOutBuf[1] << 16) >> 16); nFFtImage= (s16)(arnOutBuf[1] >> 16); // 用浮点数计算 fReal[nPhase]= 64 * nFftReal / 32768.0f; fImage[nPhase] = 64 * nFFtImage / 32768.0f; fValue[nPhase] = sqrt(fReal[nPhase] * fReal[nPhase]+ fImage[nPhase] * fImage[nPhase]) / 64; fValue[nPhase] *= 65535; fAngle[nPhase] = atan2(fImage[nPhase], fReal[nPhase]); // 用整数计算(扩大1000倍) nReal[nPhase] = 64 * nFftReal * 1000 / 32768; nImage[nPhase] = 64 * nFFtImage * 1000 / 32768; nValue[nPhase] = 65535 * sqrt(nReal[nPhase] * nReal[nPhase] + nImage[nPhase] * nImage[nPhase]) / 64; nAngle[nPhase] = 1000 * atan2(nImage[nPhase], nReal[nPhase]); } while (1) { ; } } 测试图片如下:
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/84543.html