apFFT测量相位的精度问题
测量一个单一频率正弦信号的初相位,采样频率为一个正弦信号周期为16个点,以下就是采用apFFT数据处理的程序,其数据(共1024个点)在附件中,经计算后觉得初始相位p2222精度不够,请帮忙分析下:%FFT和apFFT比较程序,书附录1
%将apFFT用于测距
close all;clc;clear all;
%从文件读数据——开始
= uigetfile('*.txt','打开数据(*.txt)文件');
fid1 = fopen(strcat(pathname1,filename1),'rt');
if(fid1==-1)
msgbox('输入文件名或路径错误!','警告','warn');
return;
end
=fscanf(fid1,'%d',1024);
fclose(fid1);
%从文件读数据——结束
N = 16; %512;
qby = Data';
y = qby;
%y = qby(1:31);
% t=1:255;
% y = 100*cos(2*pi*t*(32)/512+(pi/2))%+0.001*cos(2*pi*t*(28.2)/N+pi);%正弦初相为0和pi
% t=0:2*N-1;
% y = cos(2*pi*t*(20.4)/N+(pi/2)); %+0.001*cos(2*pi*t*(28.2)/N+pi);%正弦初相为0和pi
subplot(311);stem((1:1024),y);
p2222 = 0;
p1111 = 0;
for i = 0 : 31
y1 = y((N+(i*32)):2*N-1+(i*32)); %取后N个数据为FFT的输入数据
win =hanning(N)';
win1 = win/sum(win);%窗归一化
y11= y1.*win1;
y11_fft = fft(y11,N);
a1 = abs(y11_fft);
=max(a1);
p1= mod(phase(y11_fft)*180/pi,360);%不用加,没有相位误差
p111(i+1)=p1(n1);
p1111 = p1111+p1(n1);
y2=y(1+(i*32):2*N-1+(i*32));%取2N-1个数据为apFFT的输入数据
winn=conv(win,win);%apFFT需要卷积窗
win2=winn/sum(winn);%窗归一化
y22=y2.*win2;
y222=y22(N:end)+;%构成长N的FFT输入数据
y2_fft=fft(y222,N);
a2=abs(y2_fft);%apFFT的振幅普
= max(a2);
p2=phase(y2_fft)*180/pi;
p2=mod(p2,360);%apFFT的相位普%
p222(i+1)=p2(n);
p2222 = p2222+p2(n);
end
p1111 = p1111 / 32;
p2222 = p2222 / 32
tt=0:N-1;
subplot(312);plot(tt,10*log10(a1),'b.-',tt,10*log10(a2),'r.-');
title('amplitude spectrum');
ylim([-150,30]);xlim();
legend('fft','apfft');
xlabel('f');ylabel('db');
grid
subplot(313);plot(tt,p1,'bo-',tt,p2,'r.-');
title('phase spectrum');
ylim();xlim();
legend('fft','apfft');
xlabel('f');ylabel('度');
grid
figure(2);
subplot(111);plot((1:32),p222);
回复 楼主 qinbao_1 的帖子
你的数据中信号是无频偏的, 没有必要用apfft, 无频偏时fft测相正确数据中噪声较大, 而FF数据中T 的阶数N=16太低,FFT的抗噪性能隨N而增大
[ 本帖最后由 zhwang554 于 2010-5-25 14:24 编辑 ] 谢谢王老师,我正在做激光相位测距系统,我在同一个距离上采集了4组数据,经N阶(16、32、64、128、256、512、1024)FFT计算其初相,程序如下:
%N阶FFT用于测距
close all;clc;clear all;
%从文件读数据——开始
= uigetfile('*.txt','打开数据(*.txt)文件');
fid1 = fopen(strcat(pathname1,filename1),'rt');
if(fid1==-1)
msgbox('输入文件名或路径错误!','警告','warn');
return;
end
=fscanf(fid1,'%d',1024);
fclose(fid1);
%从文件读数据——结束
y = Data';
stem((0:1023),y);
p2222 = 0;
p1111 = 0;
for i = 1 : 7
N=2^(i+3) %FFT阶数
NN(i) = N;
y_fft = fft(y,N);
ya = abs(y_fft);
=max(ya);
yph1 = phase(y_fft);
yph=yph1*180/pi;
yph=mod(yph,360);%apFFT的相位普%
yph11=yph(n);
p11(i)=yph11;
end
NN=NN
p11=p11
计算结果如下:
mdata34.txt
NN = 16 32 64 128 256 512 1024
p11 = 191.9083192.5357193.3645192.9790194.2812193.4871192.7479
mdata33.txt
NN = 16 32 64 128 256 512 1024
p11 = 195.1610195.0479194.9913195.2151194.1664193.7956193.4624
mdata32.txt
NN = 16 32 64 128 256 512 1024
p11 = 192.9907193.7752193.5048193.0626193.2977193.7115193.4100
mdata31.txt
NN =16 32 64 128 256 512 1024
p11 = 193.6931193.5931194.2845193.4922193.5278193.0812192.9917
问题1:对于同一组数据,阶数NN不相同,求出的相位相差较大,如何确定FFT的阶数;
问题2:阶数NN相同的情况下每组数据计算的初相位数据较散达不到要求(精尺为2500mm,1mm相当于0.1度),
请王老师帮忙分析下是采集的数据时序的问题、算法问题还是干扰问题造成的以上情况
先谢了
[ 本帖最后由 qinbao_1 于 2010-5-25 14:50 编辑 ]
回复 楼上 qinbao_1 的帖子
一股N越大, 精度越高你的测试数据中
NN=512, 分散度最低 193.4871 193.7956 193.7115 193.0812 精度在0.8度
N=1024也差不多测试噪声能否降低, 测试噪声包括A/D変换器的量化噪声. 你的A/D変换器精度太低,只有正负6比特,量化级只有正负64个等级, 即A/D变换器的精度只有7比特, 要用16比特才能符合高精度要求
你用apfft也测一下, 以比较
[ 本帖最后由 zhwang554 于 2010-5-25 18:20 编辑 ]
回复 地板 zhwang554 的帖子
对之前上传的4组数据(1024个点)进行512阶apFFT处理相位如下:p2222=170.2652
p2222=171.0414
p2222=171.6989
p2222=170.5220
峰峰值在1.4337度;
之前的FFT阶数不能超过采样点数的一半(512),否则没效果;
我分析现在的精度不高的问题在于
1.信号采样的问题,一方面可能是信号噪声大,另一方面是信号的起始位值不一致(这4组信号采样起始端不一致造成的);
2.算法问题
请您能帮我分析下这四组信号本身的采样是否有问题,单从算法能弥补吗,这里要求的精度是0.1度
不胜感激!
回复 楼上 qinbao_1 的帖子
4组数据的前16个采样值如下:Mtada31 -41 -34 -22 -5 13 29 41 48 47 39 26 10 -8 -26 -38 -43
Mtada32 -41 -35 -22 -5 12 29 41 47 47 40 27 10 -8 -25 -37 -43
Mtada33 -40 -33 -21 -3 14 30 41 47 46 38 25 9 -10 -26 -37 -42
Mtada34 -42 -35 -23 -6 12 28 40 47 47 40 27 11 -7 -24 -36 -42
可见4组数据的起点是一致的. 不会差一个取样点
但同一时刻 采样值 起伏太大, -40到-42-33到-35 -9到-11 都差2第12点 -7到-10 差3, 差值占采样值百分比太大了
这主要是7比特的A/D变换的量化噪声引起的, 也可能是取样时刻的漂移引起的
这个A/D变换的量化噪声就限制测量精度, 算法不能弥补
[ 本帖最后由 zhwang554 于 2010-5-25 19:30 编辑 ]
页:
[1]