|
楼主 |
发表于 2024-1-4 13:58:25
|
显示全部楼层
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
for(i=0;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[2*i]=100+30*arm_sin_f32(2*PI*i*7/FFT_LENGTH+PI*(30/180))+ //PI*30/180
30*arm_sin_f32(2*PI*i*9/FFT_LENGTH+PI*(210/180)); //实部
// 30*arm_sin_f32(2*PI*i/FFT_LENGTH)+
// 30*arm_sin_f32(2*PI*i*4/FFT_LENGTH+PI*180/180); //生成输入信号实部
fft_inputbuf[2*i+1]=0;//虚部全部为0
}
__HAL_TIM_SET_COUNTER(&TIM3_Handler,0);//重设TIM3定时器的计数器值
timeout=0;
arm_cfft_radix4_f32(&scfft,fft_inputbuf); //FFT计算(基4)
//fft_inputbuf以实部和虚部的形式存储输入数据
time=__HAL_TIM_GET_COUNTER(&TIM3_Handler)+(u32)timeout*65536;//计算所用时间
// sprintf((char*)buf,"%0.3fms\r\n",time/1000);
// LCD_ShowString(30+12*8,160,100,16,16,buf); //显示运行时间
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //把运算结果复数求模得幅值
//用于计算复数模值 fft_outputbuf存储取模后的值
printf("\r\n%d point FFT runtime:%0.3fms\r\n",FFT_LENGTH,time/1000);
printf("FFT Result:\r\n");
for(i=0;i<FFT_LENGTH;i++)
{
if(fft_outputbuf>1){
printf("fft_outputbuf[%d]:%f\r\n",i,fft_outputbuf);
if(i>=1){
//float x=sqrt(fft_inputbuf[2*i]*fft_inputbuf[2*i]+fft_outputbuf*fft_outputbuf);
xiangwei = atan2(fft_inputbuf[2*i+1],fft_inputbuf[2*i]);//x
xiangwei = xiangwei*180.0f/PI;
printf("xiangwei:%f\r\n",xiangwei);
fudu = fft_outputbuf/(FFT_LENGTH/2);
printf("fudu:%f\r\n",fudu);
pinlv = i*1024/1024;
printf("pinlv:%f\r\n",pinlv);
flag=flag+1;
if(flag==2) {
flag=0;
break;
}
}
}
}
}else delay_ms(10);
t++;
if((t%10)==0)LED0=!LED0;
}
}这是代码
|
|