yangzj 发表于 2007-4-28 14:31

关于离散频谱校正

本帖最后由 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 发表于 2007-4-30 12:40

原帖由 yangzj 于 2007-4-30 12:37 发表
呵呵,看来是没有市场哦

可能近来大家都想放假,没有心思在论坛上吧,呵呵。版主写的东西比较深奥,偶不是专搞这个的,所以看不懂,不然一定捧场

yangzj 发表于 2007-4-30 12:48

多谢eight的捧场。
我现在做的课题是“噪声对离散频谱校正的影响及其改进方法”,发这帖一来想让不了解的人有一个了解,二来是想大家对“非常精确的提取信号的频率、幅值和相位参数的意义”发表一下看法。:@)

larf241 发表于 2007-5-6 15:18

这个地方真是不错了!
   请问LZ 给一个 WAV 音频文件, 用FFT变换,然后怎样用相位补偿的方法来校正,使得得到的结果更为精确?
   LZ 你是爱打拳皇吗?

w89986581 发表于 2007-5-6 15:36

我尝试用全相法修正离散频谱,然后估计相位,没有成功过:(

yangzj 发表于 2007-5-6 15:37

原帖由 w89986581 于 2007-5-6 15:36 发表
我尝试用全相法修正离散频谱,然后估计相位,没有成功过:(
呵呵,个人认为那篇文章是有问题的.不知道作者是怎么做出来的

zhangnan3509 发表于 2007-5-7 10:26

回复 #7 yangzj 的帖子

这进一步证实了我的观点,大当家是对FFT有所研究的!:lol

zhwang554 发表于 2007-5-7 12:50

用全相位测相位的程序在本论坛的"请教全相位谱分析问题"和"如何准确确定信号中强线谱的相位?"有介绍
非常精确的提取信号的频率、幅值和相位参数的意义是很大的,用FFT非常精确的提取信号的频率、幅值和相位参数的意义更大,它可以同时测出多个信号的频率、幅值和相位参数.相位测量很重要,相位测准了,测两点相位可得频率,用於激光相位测距可测距离,用於GPS载波相位定位可定位,用於测电流和电压滞后相位角可测材料的介质滞后角。频率测准了也很有用,测运动物体发出频率的多谱勒效应可得运动物体的速度,测激光在倾斜面上形成黑白光栅产生的正弦波频率可得激光波长等

你介绍的比值法不错,但它涉及2条谱线,用全相位时移相位差法效果好.即二段相隔N个样点的2N-1个样点序列,其同一谱线下的相位差值即频偏校正值,apFFT相位不用校正,幅值由频偏值校正

yangzj 发表于 2007-5-7 13:02

原帖由 zhwang554 于 2007-5-7 12:50 发表
用全相位测相位的程序在本论坛的"请教全相位谱分析问题"和"如何准确确定信号中强线谱的相位?"有介绍
非常精确的提取信号的频率、幅值和相位参数的意义是很大的,用FFT非常精确的提取信号的频率、幅值和相位参数 ...

非常感谢,现在我知道怎么用全相位法来做校正了,就是你说的"全相位时移相位差法",求得时移T的两段信号的相位差,这个相位差应该是2*pi*f*T,做一些简单的变化就可得到频率偏差,这个思想和普通的"时移相位差法"的思想是一样的,不知道这种方法有什么优点,扩噪能力是不是能更好一些?

[ 本帖最后由 yangzj 于 2007-5-7 13:08 编辑 ]

zhwang554 发表于 2007-5-7 15:12

回复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干净些,校正精度也好些.所以全相位时移相位差法比原时移相位差法在无噪时好一倍,有噪时略好些,密集谱好多些.

larf241 发表于 2007-5-7 15:44

回复楼上的,
数学公式你用别的写好做成附件上传就好了 !   谢谢啊别怕麻烦 !

larf241 发表于 2007-5-7 15:48

回复 zhangnan3509 老兄

请问你在做全相位校正FFT的时候有相关的MATLAB 的程序吗?
可以帖个出来借鉴下不 ?
   谢谢 不吝赐教

yangzj 发表于 2007-5-7 16:53

原帖由 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 编辑 ]

zhwang554 发表于 2007-5-7 16:54

数学公式

页: [1] 2 3 4 5 6 7 8
查看完整版本: 关于离散频谱校正