【数字信号处理】正弦波傅里叶分析

文章目录
- 要求
- 主要代码分析
要求
测量所产生正弦信号的失真度,正弦波失真度可以定义为全部谐波电压的有效值与基波电压的有效值之比并以百分数表示:

测量系统框架如下所示:

利用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,频率分辨力接近100Hzdelay(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;}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
