zlb 发表于 2024-1-4 11:34:12

STM32对正弦波进行FFT后求解相位,但是求出来的不是初始相位,这是为什么呢??、

代码如下   


eric2013 发表于 2024-1-4 13:41:07

FFT变换的数据来自那里,ADC采集的吗?

你这个求解方式会把模值比较小的也求了相位。处理后,会好很多


zlb 发表于 2024-1-4 13:56:16

eric2013 发表于 2024-1-4 13:41
FFT变换的数据来自那里,ADC采集的吗?

你这个求解方式会把模值比较小的也求了相位。处理后,会好很多
...

直接用sin函数取的实部,应该怎么处理呢   大佬可以给个思路吗

zlb 发表于 2024-1-4 13:58:25

eric2013 发表于 2024-1-4 13:41
FFT变换的数据来自那里,ADC采集的吗?

你这个求解方式会把模值比较小的也求了相位。处理后,会好很多
...

while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY0_PRES)
                {
                        for(i=0;i<FFT_LENGTH;i++)//生成信号序列
                        {
                               fft_inputbuf=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=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*fft_inputbuf+fft_outputbuf*fft_outputbuf);
                                xiangwei = atan2(fft_inputbuf,fft_inputbuf);//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;                  
        }
}这是代码

老安 发表于 2024-2-19 11:17:23

如果你想问的是箭头指向那一行代码,那是把角度相位变成弧度。

角度乘以派除180就是弧度。
页: [1]
查看完整版本: STM32对正弦波进行FFT后求解相位,但是求出来的不是初始相位,这是为什么呢??、