要求
测量所产生正弦信号的失真度,正弦波失真度可以定义为全部谐波电压的有效值与基波电压的有效值之比并以百分数表示:
测量系统框架如下所示:
利用STM32的DSP库中的FFT算法,获得基波和各谐波分量的电压,从而计算出失真度;
根据计算出的失真度,调整正弦信号发生器的性能,使产生的正弦信号失真度越小越好。
主要代码分析
int main(void)
{
unsigned short n,k,j,old_k = 0;
float Vmax,old_Vmax,Vo,temp=0,u;;
system_init();
printf(" \r\n\r\nFrequence Analysis starting...\r\n");
while(1)
{
for(n=0;n<N;n++)
{
// delay(72);//经示波器分析,采样间隔接近10us,采样频率接近102.4kHz,频率分辨力接近100Hz
delay(288); //经示波器分析,频率分辨力接近27Hz 方波理想1.4KHZ以上,正弦波是7KHZ以上
// delay(440);
data_in[n] = ((signed short)ADC_GetConversionValue(ADC1))<<16;
}
cr4_fft_1024_stm32(data_out, data_in, N);
GetPowerMag();
k = GetMaxMag();
//测失真度代码
for(j=2;j*k<N/2;j++)
{
//考虑频谱泄漏
temp+=( Mag[j*k]+ Mag[j*k+1]+ Mag[j*k-1] ) * ( Mag[j*k]+ Mag[j*k+1]+ Mag[j*k-1] );
}
temp=sqrt(temp);
u=temp*100/( Mag[k]+ Mag[k+1]+ Mag[k-1] );
Vmax = Mag[k]*3.3/4096;
//考虑频谱泄漏后的电压
Vo = (Mag[k]+Mag[k+1]+Mag[k-1])*3.3/4096-3;
if( k!=old_k || fabs(Vmax - old_Vmax)/Vmax > 0.05) //监测到频率有变化,刷新显示数据
printf(" The frequence of input signal is %d Hz. Vmax = %.2fV Vo = %.2fV U=%.2f %% \r\n\r\n",k*27,Vmax,Vo,u);
old_k = k;
old_Vmax = Vmax;
}
}