OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5044|回复: 0

FFT进行两个信号的相位分析 采样频率 采样点选取(从0开始可以,从1开始就不行?)请教!

[复制链接]

8

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2011-11-14
在线时间
2 小时
发表于 2015-5-29 11:19:29 | 显示全部楼层 |阅读模式
5金钱
问题:
         在第2步中 采样点从t=0开始,连续取64个进行FFT变换,结果显示正确
          在第5步中  采样点从t=1开始,连续取64个进行FFT变换,结果显示不出正确的相位
请教:
           如果要检测一个信号的相位是不是 ADC采样数据不能从任意时刻开始以采样频率连续取点?如果不能,请给些建议,谢谢(FFT函数使用的是原子老师上传的程序,本人初学FFT,还请指教)
 

程序步骤如下:

1、定义模拟信号的特征

#define F1 50 //信号1的频率
#define A1 3 //幅值
#define P1 30 //相位

#define F2 150 //信号2的频率
#define A2 1.5 //幅值
#define P2 30 //相位

2、对模拟信号波形进行采样,采样频率为3200(程序中用NPT_T表示),采样点64(程序中用FFT_N表示)个进行FFT

            for(t=0;t<FFT_N;t++)              //t=0时刻开始采样,正确             
            {
                fftres[t].real=2+A1*cos(2*PI*F1*t/NPT_T+PI*P1/180)+A2*cos(2*PI*F2*t/NPT_T+PI*P2/180); 
                fftres[t].imag=0;                               
            }

3、FFT变换并打印输出

             printf("////////////////////////FFT开始///////////////////////////////////////\r\n");
            FFT(fftres,FFT_N);//64点FFT
            for(t=0;t<FFT_N;t++)
            {
                printf("%d %8.3f %8.3f %8.3f\r\n",t,fftres[t].real,fftres[t].imag,atan2(fftres[t].imag,fftres[t].real)*180/PI);//串口依次显示  序号-实部-虚部-相位              
            }
            printf("////////////////////////FFT结束///////////////////////////////////////\r\n");
4、串口输出结果如下:
////////////////////////FFT开始///////////////////////////////////////
0  128.000    0.000    0.000
1   83.140   48.001   30.000   //50hz的信号的    相位 为30 正确
2   -0.000   -0.000 -177.288
3   41.570   23.999   29.999   //150hz的信号的  相位为30 正确
4    0.000    0.000   28.775
5    0.000    0.000   22.966
6    0.000    0.000   49.811
7   -0.000    0.001   92.655
8   -0.000    0.000  180.000
9   -0.000    0.001  127.960
10    0.000    0.000   29.403
11   -0.000    0.000  173.127
12    0.000    0.000    0.692
13   -0.000    0.001  109.742
14    0.000    0.000   27.448
15   -0.000    0.000  124.485
16    0.000    0.000    0.000
17   -0.000    0.000  144.261
18   -0.000   -0.000 -155.337
19   -0.001    0.000  158.117
20    0.000   -0.000  -29.771
21    0.000    0.000   87.512
22    0.000    0.000   25.228
23   -0.000    0.000  140.796
24    0.000    0.000    0.000
25   -0.000    0.000  174.098
26   -0.000   -0.000 -119.554
27   -0.000   -0.000 -135.649
28   -0.000   -0.000 -144.356
29    0.000   -0.001  -64.537
30   -0.000   -0.000 -151.082
31   -0.000    0.001   94.558
32    0.000    0.000    0.000
33   -0.000   -0.001  -94.558
34   -0.000    0.000  151.082
35    0.000    0.001   64.537
36   -0.000    0.000  144.356
37   -0.000    0.000  135.649
38   -0.000    0.000  119.554
39   -0.000   -0.000 -174.098
40    0.000    0.000    0.000
41   -0.000   -0.000 -140.796
42    0.000   -0.000  -25.228
43    0.000   -0.000  -87.512
44    0.000    0.000   29.771
45   -0.001   -0.000 -158.117
46   -0.000    0.000  155.337
47   -0.000   -0.000 -144.261
48    0.000    0.000    0.000
49   -0.000   -0.000 -124.485
50    0.000   -0.000  -27.448
51   -0.000   -0.001 -109.742
52    0.000   -0.000   -0.692
53   -0.000   -0.000 -173.127
54    0.000   -0.000  -29.403
55   -0.000   -0.001 -127.960
56   -0.000    0.000  180.000
57   -0.000   -0.001  -92.655
58    0.000   -0.000  -49.811
59    0.000   -0.000  -22.966
60    0.000   -0.000  -28.775
61   41.570  -23.999  -29.999
62   -0.000    0.000  177.288
63   83.140  -48.001  -30.000
////////////////////////FFT结束///////////////////////////////////////
 5、如果将上面的第2步中的程序中的t从1开始取样 输出结果相位对不上 请教
 
            for(t=1;t<FFT_N+1;t++)                 //t=1时刻 采样         相位不正确???????????????   
            {
                fftres[t-1].real=2+A1*cos(2*PI*F1*t/NPT_T+PI*P1/180)+A2*cos(2*PI*F2*t/NPT_T+PI*P2/180); 
                fftres[t-1].imag=0;                               
            }

6、fft并输出


             printf("////////////////////////FFT开始///////////////////////////////////////\r\n");
            FFT(fftres,FFT_N);//64点FFT
            for(t=0;t<FFT_N;t++)
            {
                printf("%d %8.3f %8.3f %8.3f\r\n",t,fftres[t].real,fftres[t].imag,atan2(fftres[t].imag,fftres[t].real)*180/PI);
            }
            printf("////////////////////////FFT结束///////////////////////////////////////\r\n");

7、输出结果
 

////////////////////////FFT开始///////////////////////////////////////
0  128.000    0.000    0.000
1   78.035   55.919   35.625   ///////////////??????????????????? x相位不对????????????
2   -0.000   -0.000 -165.627
3   32.813   35.033   46.874  //////////////?????????????????????x相位不对?????????
4    0.000    0.000   51.275
5    0.000    0.000   12.790
6    0.000    0.000   74.949
7    0.000    0.001   84.033
8   -0.000   -0.000 -135.000
9   -0.001    0.001  134.510
10    0.000    0.000   76.807
11   -0.000   -0.000 -170.143
12    0.000    0.000   68.193
13   -0.000    0.001   91.190
14   -0.000    0.000   93.080
15   -0.000    0.001  117.636
16    0.000    0.000    0.000
17   -0.001    0.000  150.878
18    0.000   -0.000  -46.061
19   -0.001    0.000  176.363
20    0.000    0.000   82.729
21    0.000    0.000   71.898
22   -0.000    0.000  140.548
23   -0.000    0.000  133.090
24   -0.000    0.000  135.000
25   -0.000   -0.000 -179.450
26    0.000    0.000   39.536
27   -0.000   -0.000 -120.365
28    0.000    0.000   13.147
29    0.000   -0.001  -81.368
30    0.000    0.000   32.535
31    0.000    0.001   89.026
32    0.000    0.000    0.000
33    0.000   -0.001  -89.026
34    0.000   -0.000  -32.535
35    0.000    0.001   81.368
36    0.000   -0.000  -13.147
37   -0.000    0.000  120.365
38    0.000   -0.000  -39.536
39   -0.000    0.000  179.450
40   -0.000   -0.000 -135.000
41   -0.000   -0.000 -133.090
42   -0.000   -0.000 -140.548
43    0.000   -0.000  -71.898
44    0.000   -0.000  -82.729
45   -0.001   -0.000 -176.363
46    0.000    0.000   46.061
47   -0.001   -0.000 -150.878
48    0.000    0.000    0.000
49   -0.000   -0.001 -117.636
50   -0.000   -0.000  -93.080
51   -0.000   -0.001  -91.190
52    0.000   -0.000  -68.193
53   -0.000    0.000  170.143
54    0.000   -0.000  -76.807
55   -0.001   -0.001 -134.510
56   -0.000    0.000  135.000
57    0.000   -0.001  -84.033
58    0.000   -0.000  -74.949
59    0.000   -0.000  -12.790
60    0.000   -0.000  -51.275
61   32.813  -35.033  -46.874
62   -0.000    0.000  165.627
63   78.035  -55.919  -35.625
////////////////////////FFT结束///////////////////////////////////////

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-28 23:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表