无限剑制 发表于 2010-2-26 11:36

全相位书中附录3遇到出现幅值NaN的问题

论坛中给的校正的判断部分是:
%%%%%%%%%%%%%%%%%%%%%
dph=angle(F2)-angle(F1);
dph=mod(dph,2*pi);
   if dph>pi
      dph=dph-2*pi;
      elseif dph<-pi
      dph=dph+2*pi;
   end   
   dk=dph/pi/2;
   g=dk
      h=2*pi*g.*(1-g.*g)./sin(pi*g);
      AA=abs((h.^2).*F1)/2;
%%%%%%%%%%%%%%%%%%%%

这里如果g=0会出现NaN的结果
在丁康老师的书里好象叫什么死点的,这个我不太懂,希望各位高手能给点建议!!


下边是程序:
function[] = apFFT_Correct(N,Fs,f,A,Ph)
    CNum = length(f);
    t=-N+1:N*2-1;          %apfft时移相位差法需要3N-1点
    s = zeros(1,length(t));
   
for i=1:CNum
      myt=A(i)*cos(2*pi*t*f(i)/Fs+Ph(i)*pi/180);
       s=s+myt;
end
plot(s);
s=s(1:3*N-1);
win=hanning(N)';
win1=hann(N)';
win2=conv(win,win1);   
win2=win2/sum(win2);   %归一化卷积窗
w=pi*2;
s1=s(1:2*N-1);   %取前2N-1点做FFT
s1=s1-ones(size(s1)).*mean(s1);%消直流
y1=s1.*win2;
y1a=y1(N:end)+;
F1=fft(y1a,N);
s2=s(1+N:3*N-1);   %后2N-1点
s2=s2-ones(size(s2)).*mean(s2);
y2=s2.*win2;
y2a=y2(N:end)+;%全相位预处理
F2=fft(y2a,N);
a1=abs(F1);
L=fix(N/2)+1;            %只查看一半的幅值
f=(0:L)*Fs/N;
for i=1:CNum            
    = max(a1(1:L));
   k=Ind(i);
    peak_F2(i)=F2(k);
    peak_F1(i)=F1(k);
    StartP=Ind(i)-2;
    StopP=Ind(i)+2;
    if Ind(i)-2<1
      StartP=1;
    end
    if Ind(i)+2>L
      StopP=L;
    end
    Indx=StartP:StopP;
    a1(Indx)=zeros(1,length(Indx));
   
end
num=length(Ind);%%%%%设置所取的“谐波簇”个数
for m=1:num;
      disp('振幅校正前')
      peak_F2(m)
      peak_F1(m)
      = apFFT_Corret1(Ind(m),peak_F2(m),peak_F1(m));
end
disp('校正的频率')
fm=*Fs/N
disp('校正的相位')
PH=mod(PH*180/pi,360)
disp('校正的振幅')
AA
function = apFFT_Corret1(k0,F2,F1)   
dph=angle(F2)-angle(F1);
dph=mod(dph,2*pi);
   if dph>pi
      dph=dph-2*pi;
      elseif dph<-pi
      dph=dph+2*pi;
   end   
   dk=dph/pi/2;
   g=dk
      h=2*pi*g.*(1-g.*g)./sin(pi*g);
      AA=abs((h.^2).*F1)/2;
      fff=(k0+dk-1);
      PH=angle(F1);

下边是测试程序:

%%%%%%%%%%%%%%%%%%校正程序测试
close all;
clear all;
clc;
%%%%%%%%%%%%%%%%%%%%%校正方法选择:0,时移位相位差法;1,fft/apfft法   %%%%%%%%%%%%%
       method = 0;                                                      
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Fs = 200;%采样频率Hz
N = 256;   %FFT计算的点数,实际采样点数比这个多2N-1/3N-1         
f1=;    %频率
a1=;      %幅度
ph1 =;   %相位
if method
fft_apfft(N,Fs,f1,a1,ph1)
else
apFFT_Correct(N,Fs,f1,a1,ph1);
end

%这里我模拟采样长度不是整树周期,Fs=200, N 固定255点。幅度校正出了个NaN

无限剑制 发表于 2010-2-26 11:37

那个Fs = 200 N=256,上边打错了

zhwang554 发表于 2010-2-26 13:11

回复 楼主 无限剑制 的帖子

f1=100, 在fs=200, N=256时, 折合频率=f1*N/fs=128, 即振幅谱峰值在N=256频谱的中点,不只振幅校正不对,相位也不对.

在其它点, g=0(折合频率是整数)没有关系, 仍能校正振幅


[ 本帖最后由 zhwang554 于 2010-2-26 17:49 编辑 ]

无限剑制 发表于 2010-2-26 13:28

哦,明白了,我这没满足采样定理,信号没学好。
感谢王老师的指点:lol

jinyi7016 发表于 2015-1-29 15:19

能把 apFFT_Correct 的程序分享下么?感谢
页: [1]
查看完整版本: 全相位书中附录3遇到出现幅值NaN的问题