void FFT_UIC()
{
u8 i;
fCosU=0;
fSinU=0;
fCosI=0;
fSinI=0;
fCos=0;
fSin=0;
// T_ON();
memset(fft_inputbuf,0,FFT_LENGTH);
memset(fft_outputbuf,0,FFT_LENGTH);
for(i=0;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[2*i]=ADC_3[i]; //生成输入信号实部
fft_inputbuf[2*i+1]=0;//虚部全部为0
}
arm_cfft_radix2_f32(&scfft,fft_inputbuf); //FFT计算(基4)
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //把运算结果复数求模得幅值 45us
fftu1=fft_outputbuf[1]/103220;/*基波有效值 vpp*/
fCosU=fft_inputbuf[2]/fft_outputbuf[1];//实部
fSinU=fft_inputbuf[3]/fft_outputbuf[1];//虚部
memset(fft_inputbuf,0,FFT_LENGTH);
memset(fft_outputbuf,0,FFT_LENGTH);
for(i=0;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[2*i]=ADC_7[i]; //生成输入信号实部
fft_inputbuf[2*i+1]=0;//虚部全部为0
}
arm_cfft_radix2_f32(&scfft,fft_inputbuf); //FFT计算(基4)
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //把运算结果复数求模得幅值
ffti1=fft_outputbuf[1]/103210;/*基波有效值 vpp*/
fCosI=fft_inputbuf[2]/fft_outputbuf[1];//实部
fSinI=fft_inputbuf[3]/fft_outputbuf[1];//虚部
fCos=fCosU*fCosI + fSinU*fSinI;
fSin=fSinU*fCosI - fCosU*fSinI;
SC=rms3*rms6;
PC=SC*fCos;
QC=SC*fSin;
PFC=PC/SC;
// T_OFF();
}
void FFT_HRI()
{
u16 i;
fCosU=0;
fSinU=0;
fCosI=0;
fSinI=0;
fCos=0;
fSin=0;
// T_ON();
memset(fft_inputbuf,0,FFT_LENGTH);
memset(fft_outputbuf,0,FFT_LENGTH);
for(i=0;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[2*i]=ADC_9[i]; //生成输入信号实部
fft_inputbuf[2*i+1]=0;//虚部全部为0
}
arm_cfft_radix2_f32(&scfft,fft_inputbuf); //FFT计算(基2)
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //把运算结果复数求模得幅值 45us
fft_hria=fft_outputbuf[1]/524.626;/*基波有效值 vpp*/
memset(fft_inputbuf,0,FFT_LENGTH);
memset(fft_outputbuf,0,FFT_LENGTH);
for(i=0;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[2*i]=ADC_10[i]; //生成输入信号实部
fft_inputbuf[2*i+1]=0;//虚部全部为0
}
arm_cfft_radix2_f32(&scfft,fft_inputbuf); //FFT计算(基2)
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //把运算结果复数求模得幅值
fft_hrib=fft_outputbuf[1]/526.628;/*基波有效值 vpp*/
}
可由公式 atan2(imag, real) 得到相位值。
其中:imag为虚数值,real为实数值,atan2为求反正切值。