碧潭 发表于 2010-3-22 10:54

求助apFFT实际数据程序

王老师,您好,希望你可以看到我的帖子,我刚开始学习apFFT,出现了点问题,就是如何实现实测数据的apFFT,我们知道apFFT序列中
t=-N+1:N-1,而实测数据t从0开始,如果我们取序列中2N个点,第N个点为中心,相当与仿真信号中t=0的位置,不知到我的理解是否正确。
编程如下:
clc
clear
N=1024;
Fs = 400;    % Sampling frequency               
T = 1/Fs;       % Sample time            
L=2*N;                        % Length of signal
f = Fs/2*linspace(0,1,N/2+1);   
t = (0:L-1)*T;
y=cos(2*pi*t*20+20*pi/180)+cos(2*pi*t*50+50*pi/180)+cos(2*pi*t*70+70*pi/180);
win=hanning(N)';
win1=win/sum(win);
x1=y(N:2*N-1);
y1=x1.*win1;
y1_fft=fft(y1,N);
a1=abs(y1_fft);
p1=mod(phase(y1_fft)*180/pi,360);   %FFT
winn=conv(win,win);
win2=winn/sum(winn);
x2=y(1:2*N-1);
y2=x2.*win2;
y2=y2(N:end)+;
y2_fft=fft(y2,N);
a2=abs(y2_fft);
p2=mod(phase(y2_fft)*180/pi,360);
ee=mod((p1-p2)/180/(1-1/N),1);
aa=(a1.^2)./(a2*2);
subplot(211);plot(f,a2(1:N/2+1));
subplot(212);stem(f,p2(1:N/2+1))

数据结果,频率正确,而相位信号出错,见图1
如果将时间t改为:t = (-N+1:N+1)*T,则频率和相位均正确,见图2;
所以我就想知道如果是实测数据,该如何实现apFFT?

zhwang554 发表于 2010-3-22 14:05

回复 楼主 碧潭 的帖子

本帖最后由 wdhd 于 2016-9-20 14:08 编辑

  apFFT测的是2N-1数据中心点的相位
  cos信号 t=-N+1 : N-1, 中心点是t=0, 测的是cos信号的初相位(t=0)
  实测数据y=y(1 : 2N-1), 第N个点为中心, 测的实测数据第N个点的相位
  你的理解正确。程序结果正确
  你想知道实测数据如何实现apFFT?
  输入实测数据y=y(1 : 2N-1); (Matlab中数据从1开始), 测的实测数据第N点的相位
  [ 本帖最后由 zhwang554 于 2010-3-22 14:11 编辑 ]

碧潭 发表于 2010-3-22 14:29

谢谢您的帮助,您的意思是实测数据经过apFFT后是相对于中心点N的相位吗?如果这样的话,程序结果是没问题的,可是对于实测数据又如何求它的初相位呢?

碧潭 发表于 2010-3-22 14:35

我用FFT对实测数据处理后,求相角,得到的相位值却是是初相位,两者之间的差异在什么地方?FFT的相位结果又是相对于哪个点呢??

zhwang554 发表于 2010-3-22 18:12

回复 板凳 碧潭 的帖子

本帖最后由 wdhd 于 2016-9-20 14:08 编辑

  DFT和FFT相位谱测的是序列第1个样点的相位
  [ 本帖最后由 zhwang554 于 2010-3-22 18:16 编辑 ]

zhwang554 发表于 2010-3-22 18:19

回复 地板 碧潭 的帖子

本帖最后由 wdhd 于 2016-9-20 14:08 编辑

  你说的实测数据的初相位是第1个样点的相位吗?
  实用时, 我们对一个正弦波连续取样2N-1点,测出的是第N个样点的相位,但若要知道第一个取样时刻的样点相位,即初相位,须
  知第N个样点的时间T, 从测量值减去相隔T的相位. . 减去的相位是与cos信号的频率相关的, 而这个精确的频率是用校正法求出
  [ 本帖最后由 zhwang554 于 2010-3-22 18:28 编辑 ]

碧潭 发表于 2010-3-22 19:09

嗯,基本明白了,谢谢王老师

yzzzwei 发表于 2010-4-21 22:32

我也明白了,谢谢
页: [1]
查看完整版本: 求助apFFT实际数据程序