qinbao_1 发表于 2010-5-25 10:06

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);

zhwang554 发表于 2010-5-25 12:06

回复 楼主 qinbao_1 的帖子

你的数据中信号是无频偏的, 没有必要用apfft, 无频偏时fft测相正确

数据中噪声较大, 而FF数据中T 的阶数N=16太低,FFT的抗噪性能隨N而增大

[ 本帖最后由 zhwang554 于 2010-5-25 14:24 编辑 ]

qinbao_1 发表于 2010-5-25 14:23

谢谢王老师,我正在做激光相位测距系统,我在同一个距离上采集了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 编辑 ]

zhwang554 发表于 2010-5-25 15:10

回复 楼上 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 编辑 ]

qinbao_1 发表于 2010-5-25 15:47

回复 地板 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度
不胜感激!

zhwang554 发表于 2010-5-25 16:12

回复 楼上 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]
查看完整版本: apFFT测量相位的精度问题