声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1789|回复: 5

[FFT] apFFT测量相位的精度问题

[复制链接]
发表于 2010-5-25 10:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
测量一个单一频率正弦信号的初相位,采样频率为一个正弦信号周期为16个点,以下就是采用apFFT数据处理的程序,其数据(共1024个点)在附件中,经计算后觉得初始相位p2222精度不够,请帮忙分析下:

%FFT和apFFT比较程序,书附录1
%将apFFT用于测距
close all;clc;clear all;
%从文件读数据——开始
[filename1,pathname1] = uigetfile('*.txt','打开数据(*.txt)文件');
fid1 = fopen(strcat(pathname1,filename1),'rt');
if(fid1==-1)
    msgbox('输入文件名或路径错误!','警告','warn');
    return;
end
[Data,num]=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);
    [c1,n1]=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)+[0 y22(1:N-1)];%构成长N的FFT输入数据
    y2_fft=fft(y222,N);
    a2=abs(y2_fft);%apFFT的振幅普
    [c,n] = 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([0,N/2]);
legend('fft','apfft');
xlabel('f');ylabel('db');
grid
subplot(313);plot(tt,p1,'bo-',tt,p2,'r.-');
title('phase spectrum');
ylim([0,400]);xlim([0,N/2]);
legend('fft','apfft');
xlabel('f');ylabel('度');
grid
figure(2);
subplot(111);plot((1:32),p222);

mdata34.txt

4.37 KB, 下载次数: 5

采样数据(共1024个点)

untitled.fig

25.83 KB, 下载次数: 9

回复
分享到:

使用道具 举报

发表于 2010-5-25 12:06 | 显示全部楼层

回复 楼主 qinbao_1 的帖子

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

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

[ 本帖最后由 zhwang554 于 2010-5-25 14:24 编辑 ]
 楼主| 发表于 2010-5-25 14:23 | 显示全部楼层
谢谢王老师,我正在做激光相位测距系统,我在同一个距离上采集了4组数据,经N阶(16、32、64、128、256、512、1024)FFT计算其初相,程序如下:

%N阶FFT用于测距
close all;clc;clear all;
%从文件读数据——开始
[filename1,pathname1] = uigetfile('*.txt','打开数据(*.txt)文件');
fid1 = fopen(strcat(pathname1,filename1),'rt');
if(fid1==-1)
    msgbox('输入文件名或路径错误!','警告','warn');
    return;
end
[Data,num]=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);
    [a,n]=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.9083  192.5357  193.3645  192.9790  194.2812  193.4871  192.7479

mdata33.txt
NN = 16          32          64         128         256         512        1024
p11 = 195.1610  195.0479  194.9913  195.2151  194.1664  193.7956  193.4624

mdata32.txt
NN = 16          32          64         128         256         512        1024
p11 = 192.9907  193.7752  193.5048  193.0626  193.2977  193.7115  193.4100

mdata31.txt
NN =  16          32          64         128         256         512        1024
p11 = 193.6931  193.5931  194.2845  193.4922  193.5278  193.0812  192.9917

问题1:对于同一组数据,阶数NN不相同,求出的相位相差较大,如何确定FFT的阶数;
问题2:阶数NN相同的情况下每组数据计算的初相位数据较散达不到要求(精尺为2500mm,1mm相当于0.1度),
请王老师帮忙分析下是采集的数据时序的问题、算法问题还是干扰问题造成的以上情况

先谢了

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

mdata34.txt

4.37 KB, 下载次数: 4

mdata33.txt

4.37 KB, 下载次数: 3

mdata32.txt

4.37 KB, 下载次数: 2

mdata31.txt

4.37 KB, 下载次数: 2

发表于 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 编辑 ]
 楼主| 发表于 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度
不胜感激!
发表于 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 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-29 11:07 , Processed in 0.066928 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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