||
有几个贴子提到apfft/apfft振幅校正精度问题.
email发表于 2009-3-9 17:15 振动论坛上主题 <请大侠们看一下:全相位频谱校正问题>
http://www.chinavib.com/forum/thread-77615-1-1.html
我用全相位方法,在无噪的情况下,得到很准确的频率和相位估计,至于幅值估计,现在有些问题,我加的窗为hanning窗,校正采用时移法…
fudeyun发表于 2009-11-20 12:47 振动论坛上主题 <请教:VC下实现apFFT,但幅度校正不准确,高手帮忙看看>
http://www.chinavib.com/forum/thread-88525-1-1.html
我在VC下实现了apFFT算法,但是幅度校正不准确,情况如下…
bocaoboluo发表于 2009-11-16 22:16 振动论坛上主题<apFFT的相位和幅值计算的问题>
http://www.chinavib.com/forum/viewthread.php?tid=88438&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D186
关于apFFT分析法的结果幅值的问题在于,结果开根号后与理论值有大约0.2的误差,比如理论为2,计算结果幅值为2.2.****。不知道哪里出错了....
bocaoboluo发表于 2009-11-17 16:26 振动论坛上主题<请问王老师关于apFFT问题>中12楼
http://www.chinavib.com/forum/thread-87228-1-1.html
怎么计算apFFT的幅值呢?还是没有看明白,与FFT结果根号的关系吗?
apfft/apfft谱分析程序如书中附录三(空格前),当时为了避免出现判断语句,在频偏>0.5时,不在振幅峰值处(round(f1)+1)取振幅值,而取最大点前面的振幅值(floor(f1)+1), 有时影响精度. 注意round语句对(f1) 4舍5入,floor语句对(f1) 取整数.
若补充判断语句用下程序, 它始终在峰值处取值, 在频偏>0.5时可提高精度
另外,附录三的apfft/apfft校正法程序中原调用matlab中的hanning窗(第5句), 若改为另一种Hanning窗生成公式sin(pi*(1/2:N-1/2)/N).^2,可明显提高精度
close all;clc;clear all;
N=256*4;
t=-N+1:N*2-1; f1=39.8;A1=1;ph1=30;
s=A1*cos(1*(2*pi*t*f1/N+ph1*pi/180));
win=sin(pi*(1/2:N-1/2)/N).^2;
win2=conv(win,win);
win2=win2/sum(win2);
s1=s(1:2*N-1);
y1=s1.*win2;
y1a=y1(N:end)+[0 y1(1:N-1)];
Out1=fft(y1a,N);
a1=abs(Out1);
p1=mod(phase(Out1),2*pi);
s2=s(1+N:3*N-1);
y2=s2.*win2;
y2a=y2(N:end)+[0 y2(1:N-1)];
Out2=fft(y2a,N);
a2=abs(Out2);
p2=mod(phase(Out2),2*pi);
g=mod((p2-p1)/pi/2,1);
h=2*pi*g.*(1-g.*g)./sin(pi*g);
aa1=abs((h.^2).*a2)/2;
rr=round(f1);
fff=floor(f1)+g(rr+1)
aaa=aa1(floor(f1)+1);
ppp=p1(rr+1)*180/pi
dph=p2-p1;
dph=dph(rr);
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).*a1)/2;
aaa=AA(rr+1)
运行结果:
fff = 39.8
ppp = 29.999999999993
aaa =0.999999999999621
振幅校正精度10(-12),可见用sin(pi*(1/2:N-1/2)/N).^2;)的卷积窗振幅校正精度明显改善。
GMT+8, 2024-12-28 18:06 , Processed in 0.045368 second(s), 17 queries , Gzip On.
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.