初级会员

- 积分
- 76
- 金钱
- 76
- 注册时间
- 2011-11-14
- 在线时间
- 2 小时
|
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结束///////////////////////////////////////
|
|