关于离散频谱校正
本帖最后由 wdhd 于 2016-6-3 10:59 编辑离散频谱校正理论和技术,不知道大家对这个名词熟不熟悉.近来在论坛上看到一些帖子讨论为何经FFT得到的幅值、频率和相位不准的。
其实前面我也发过一篇介绍离散频谱校正的综述性的文章,可能大家都忙,没时间去看,呵呵,这里我就我的理解,把离散频谱分析的误差来源和校正方法做个简单的介绍。另外,我想借这个机会了解下,在实际的应用过程中,非常精确的提取这些参数有没有必要,大家平常也没有碰到由于误差而带来的困扰,例如不能对故障做出判断,甚至出现错判的例子。大家平常用离散频谱校正用的多不多?
请大家讨论下,让我对我这个方向的应用也有个了解,谢谢!
离散频谱分析的误差产生的原因主要来自两方面,一方面是由于时域加窗截断产生的频域连续化,另一方面是由于计算机只能对有限的离散的频率进行计算,也即是频域离散化的结果。其中,加窗截断的影响使一个无穷长单频率信号在频域对应的一根谱线,变成一个连续谱,以加矩形窗为例,则是变成一个sinc型函数的形状,其峰值对应的频率即为单频信号的频率。但是由于频域的离散化,我们用FFT计算的频率一般都不会刚好会落在峰值处,这就是我们平时常说的泄露,这时我们就只能把计算得到的峰值谱线对应的频率做为估计的频率,如果以频率分辨率fs/N做归一 (即把频率分辨率看成1)的话,这个估计的频率的最大绝对值误差就是0.5,而幅值误差则依赖于加的窗的类型,由于矩形窗主瓣宽度为2,频谱开状较尖,幅值误差也就大。至于相位的最大误差则会相应的达到正负90度,已经完全不能用了。
离散频谱校正就是针对这种误差提出的各种校正出实际的频率、幅值和相位的一门理论和技术。国内现在比较常用的方法有比值(插值)法、能量重心法、FFT+FT法和相位差法,都有其各自的特点和优缺点。这里我给出一个比值校正法的程序供大家一起研究下。
当然,对于多频率成分的信号来说,离散频谱分析的另一个误差是来自于频率之间的相互干涉,这也是由于泄露所引起的,这个误差则主要靠加窗抑制旁瓣和减小频率分辨率、拉大频率间的距离(可通过ZFFT实现)来尽量减小。
%SpectrumCorrect_Test.m
close all;
clear all;
clc;
fs=1024;
N=1024;
t=(0:N-1)/fs;
x=4*cos(2*pi*80*t+30*pi/180)+3*cos(2*pi*150.232*t+80*pi/180)+1*cos(2*pi*253.5453*t+240*pi/180);
xf=fft(x);
xf=xf(1:N/2)/N*2;
XfCorrect=SpectrumCorrect(xf,3,1);
XfCorrect(:,1)=XfCorrect(:,1)*fs/N;
XfCorrect
w=hann(N,'periodic');
xfw=fft(x.*w');
xfw=xfw(1:N/2)/N*4;
XfCorrectW=SpectrumCorrect(xfw,3,2);
XfCorrectW(:,1)=XfCorrectW(:,1)*fs/N;
XfCorrectW
%离散频谱比值校正法 by yangzj 2007.4.28
%
%xf为FFT后的复数谱
%CorrectNum为校正的谱线条数,即校正最大的CorrectNum条
%WindowType为加窗类型,1为矩形窗,2为Hanning窗
%
%SpectrumCorrect.m
function XfCorrect=SpectrumCorrect(xf,CorrectNum,WindowType)
XfCorrect=zeros(CorrectNum,3);
for i=1:CorrectNum
A=abs(xf);
=max(A);
phmax=angle(xf(index));
%比值法
%加矩形窗
if (WindowType==1)
indsecL=A(index-1)>A(index+1);
df=indsecL.*A(index-1)./(Amax+A(index-1))-(1-indsecL).*A(index+1)./(Amax+A(index+1));
XfCorrect(i,1)=index-1-df;
XfCorrect(i,2)=Amax/sinc(df);
XfCorrect(i,3)=(phmax+pi*df)*180/pi;
xf(index-2:index+2)=zeros(1,5);
end
%比值法
%加Hanning窗
if (WindowType==2)
indsecL=A(index-1)>A(index+1);
df=indsecL.*(2*A(index-1)-Amax)./(Amax+A(index-1))-(1-indsecL).*(2*A(index+1)-Amax)./(Amax+A(index+1));
XfCorrect(i,1)=index-1-df;
XfCorrect(i,2)=(1-df^2)*Amax/sinc(df);
XfCorrect(i,3)=(phmax+pi*df)*180/pi;
xf(index-4:index+4)=zeros(1,9);
end
XfCorrect(i,3)=mod(XfCorrect(i,3),360);
XfCorrect(i,3)=XfCorrect(i,3)-(XfCorrect(i,3)>180)*360;
end
运行结果
XfCorrect =
80.0014 4.0016 29.8261
150.2333 2.9981 79.7127
253.5397 0.9996 -118.7272
XfCorrectW =
80.0000 4.0000 30.0000
150.2320 3.0000 80.0000
253.5453 1.0000 -120.0002
[ 本帖最后由 yangzj 于 2007-4-28 15:43 编辑 ]
呵呵,看来是没有市场哦 原帖由 yangzj 于 2007-4-30 12:37 发表
呵呵,看来是没有市场哦
可能近来大家都想放假,没有心思在论坛上吧,呵呵。版主写的东西比较深奥,偶不是专搞这个的,所以看不懂,不然一定捧场 多谢eight的捧场。
我现在做的课题是“噪声对离散频谱校正的影响及其改进方法”,发这帖一来想让不了解的人有一个了解,二来是想大家对“非常精确的提取信号的频率、幅值和相位参数的意义”发表一下看法。:@) 这个地方真是不错了!
请问LZ 给一个 WAV 音频文件, 用FFT变换,然后怎样用相位补偿的方法来校正,使得得到的结果更为精确?
LZ 你是爱打拳皇吗? 我尝试用全相法修正离散频谱,然后估计相位,没有成功过:( 原帖由 w89986581 于 2007-5-6 15:36 发表
我尝试用全相法修正离散频谱,然后估计相位,没有成功过:(
呵呵,个人认为那篇文章是有问题的.不知道作者是怎么做出来的
回复 #7 yangzj 的帖子
这进一步证实了我的观点,大当家是对FFT有所研究的!:lol 用全相位测相位的程序在本论坛的"请教全相位谱分析问题"和"如何准确确定信号中强线谱的相位?"有介绍非常精确的提取信号的频率、幅值和相位参数的意义是很大的,用FFT非常精确的提取信号的频率、幅值和相位参数的意义更大,它可以同时测出多个信号的频率、幅值和相位参数.相位测量很重要,相位测准了,测两点相位可得频率,用於激光相位测距可测距离,用於GPS载波相位定位可定位,用於测电流和电压滞后相位角可测材料的介质滞后角。频率测准了也很有用,测运动物体发出频率的多谱勒效应可得运动物体的速度,测激光在倾斜面上形成黑白光栅产生的正弦波频率可得激光波长等
你介绍的比值法不错,但它涉及2条谱线,用全相位时移相位差法效果好.即二段相隔N个样点的2N-1个样点序列,其同一谱线下的相位差值即频偏校正值,apFFT相位不用校正,幅值由频偏值校正 原帖由 zhwang554 于 2007-5-7 12:50 发表
用全相位测相位的程序在本论坛的"请教全相位谱分析问题"和"如何准确确定信号中强线谱的相位?"有介绍
非常精确的提取信号的频率、幅值和相位参数的意义是很大的,用FFT非常精确的提取信号的频率、幅值和相位参数 ...
非常感谢,现在我知道怎么用全相位法来做校正了,就是你说的"全相位时移相位差法",求得时移T的两段信号的相位差,这个相位差应该是2*pi*f*T,做一些简单的变化就可得到频率偏差,这个思想和普通的"时移相位差法"的思想是一样的,不知道这种方法有什么优点,扩噪能力是不是能更好一些?
[ 本帖最后由 yangzj 于 2007-5-7 13:08 编辑 ]
回复yangzj
本帖最后由 wdhd 于 2016-6-3 10:59 编辑由於数学公式贴不上,简单说一下.
全相位FFT的泄漏是原FFT泄漏的平方,泄漏分贝减少一倍,如FFT泄漏-20db,全相位FFT泄漏为-40db.你用apFFT的程序将apFFT的振幅谱和原FFT的振幅谱画出来,一比就知道了.复指数信号只有一条谱线,所以频率偏离时的泄漏不影响相位测量精度,无噪时误差几乎为0,但物理上用的正余弦信号都有2条谱线,泄漏互相影响,靠得近影响更大.全相位FFT泄漏分贝值比传统FFT小一倍,所以用全相位FFT测相位精度始终比传统FFT高,而且一次FFT测出,不用校正.
全相位FFT比FFT精度高在於全相位FFT泄漏分贝小一倍,但FFT泄漏是很小的,所以全相位FFT在几乎无噪时才明显好於FFT.但在密集频谱时,互相泄漏影响大,全相位FFT有实用用优势.
有噪声时,理论正全相位FFT只比传统FFT的精度好2/3,实用优势不如无噪,但总比FFT好些.但在有噪相位测量时,apFFT由於不用校正,一次FFT测相位,精度虽类同,但全相位FFT测相位比传统FFT始终有实用优势.
你对校正很了解,FFT校正是用其振幅或相位谱上校正的,全相位FFT是在全相位FFT的振幅或相位谱上校正的,由於全相位FFT的泄漏分贝比FFT小一倍,比FFT干净些,校正精度也好些.所以全相位时移相位差法比原时移相位差法在无噪时好一倍,有噪时略好些,密集谱好多些.
回复楼上的,
数学公式你用别的写好做成附件上传就好了 ! 谢谢啊别怕麻烦 !
回复 zhangnan3509 老兄
请问你在做全相位校正FFT的时候有相关的MATLAB 的程序吗?可以帖个出来借鉴下不 ?
谢谢 不吝赐教 原帖由 zhwang554 于 2007-5-7 15:12 发表
由於数学公式贴不上,简单说一下.
全相位FFT的泄漏是原FFT泄漏的平方,泄漏分贝减少一倍,如FFT泄漏-20db,全相位
FFT泄漏为-40db.你用apFFT的程序将apFFT的振幅谱和原FFT的振幅谱画出来,一比就知道了.
复 ...
非常感谢您的精彩讲解.
那我想可以这样理解:
全相位谱相对于FFT谱的优点:1、可不经校正直接得到分析数据中点的相位;
2、可减少泄露,进而减少频率间的干涉现现象,这样就可提高分析密集频谱时的精度;
3、抗噪能力略优
另外如果我这么认为不知您同不同意:全相位法之所以有2、3的优点,本质原因是加大了分析点数,因为抗噪能力与分析点数N与信噪比的乘积是成正比的,如果直接把全相位方法的分析数据都拿来做FFT的话,这个优势应该就没有了。
另外想请教下,由全相位谱由频率偏差来校正幅值会不会变得麻烦,这时候应该不是简单的跟窗谱有关
[ 本帖最后由 yangzj 于 2007-5-7 16:57 编辑 ]