基于ARM_DSP库复数FFT定点Q15结果幅值问题
本人在实验arm dsp库复数fft定点函数时遇到的问题:用库函数计算幅值32768频率50Hz信号频谱,计算后频谱频率正确但幅值有误差,请问是我程序的问题还是我理解的有问题,或者是定点计算过程中精度问题导致的?q15_t InputOutput = {0};
q15_t mag = {0};
void cfft_q15_radix4_app(void)
{
uint16_t j = 0;
/* 50Hz 幅度32768 正弦信号 */
for(uint16_t i = 0; i < 1024; i++)
{
j = i % 20;
InputOutput = arm_sin_q15(1600*j);
ANO_DT_Send_UserInt16((uint8_t *)&InputOutput);
}
arm_cfft_radix4_instance_q15 S;
arm_cfft_radix4_init_q15(&S, 1024, 0, 1);
arm_cfft_radix4_q15(&S, InputOutput); //结果缩小2^10倍
arm_cmplx_mag_q15(InputOutput, mag, 1024); //结果缩小2倍
for(uint16_t i = 0; i < 1024; i++)
{
//补偿1024点cfft缩放的1024倍; 补偿arm_cmplx_mag_q15缩放的2倍
mag = mag * 1024 * 2 / 512;
ANO_DT_Send_UserInt16((uint8_t *)&mag);
}
}
正常,有频谱泄露
恩,是频谱泄露导致的。我把信号调成32Hz,采样整数倍周期就好了。
页:
[1]