DSP

频谱细化(补零、zfft、czt)

2019-07-13 19:24发布

总结论坛知识点:
   1.全相位的致命弱点:实测数据2N-1个经过apfft变换得到N个频谱,无法从这N个频谱点恢复原来的2N-1个数据
   
   2.实际产品我们用全相位做频谱校准都非常准确,包括幅值、相位、频率,幅值误差0.01%,相位0.001DEG,频率0.01%!
   只要频率间隔大于2根谱线就能准确分辨出信号


   3.全相位无法用于实践吗?
   
   当然王兆华老师的算法只是一种,其他还有如3点,5点,能量比值校正算法,我都比较过,王兆华老师的算法实际应用
   完全是没问题的,我就用他做异频介质损耗测量,MOA阻性电流提取等一系列电力产品!


   4.为什么不直接用DFT?
  
   答:非真正同步采样必然存在频谱泄漏,用DFT必须知道信号所在频点,不然计算量太大,我们用的3,5点校正算法就是用的
   DFT实时计算,取关心频点的左右各1根或者2根组成3或者5根谱线。APFFT数据利用率是太低,我们在用的相位差APFFT需要
   3N点,不过对现在高速的DSP或者MCU来数基本不是问题,像我们做的ADC实时连续采样只需开个大点的存储空间循环DMA填充,
   DSP只要不停地计算即可实时出数,像最新的STM32F4带浮点ARM价格也非常便宜,做个1024点FFTms级的
   
   5.锁相倍频采样可以避免频谱泄露?
   
   锁相倍频采样:在交流采样技术中,交流电力信号的频率并不是固定不变的,如信号中含有谐波成分的时候。为了使采样频率能够跟上输入信
   号频率的变化,每次交流采样时都要实时检测输入信号频率的变化,并实时跟踪所测信号的频率,以确保采样频率与所测信号
   频率同步.即实现同步整周期采样.
  “锁相倍频采样”好处就是谱线刚好是频谱分辨率的整数倍所以不需要校正
  “锁相倍频采样”的工程背景是信号中只含有一个基频信号及其高次谐波信号。因此,可以用锁相环来提取这个基频信号,并
   令采样频率是所感兴趣的最高次谐波信号的整数倍。这样一来,DFT的结果是,基频及其各次谐波信号分量的谱峰均落在谱线上,
   因而就不需要校正。


  6.密集频谱如何解决?
  
  密集的只要频普分辩虑高点就行,频间隔有3根以上即可校正的很准确
  
  7. ZoomFFT根本没有实现“细化“?


  首先说频率分辨率的概念,默认指的信号客观的物理可达到的分辨率,即物理分辨率;并非“计算分辨率”
  假设信号的采样时间Delta_T定了,信号在频域上的理论最高分辨率也就已经确定了,等于Delta_f=1/Delta_T;
  如果你把信号补一倍长度的0,可以计算出一个分辨率为0.5*Delta_f的频谱,但这对信号分析没有增加新的物理信息,其实
  仅仅是数学游戏;增加的是“计算分辨率”,没有增加任何“物理分辨率”。


  再说什么是细化。所谓细化,我认为定义应该是:(不增加信号时域长度的情况下),提高其频谱分析物理分辨率的操作。
  ZoomFFT,实现时,如果细化为原来的D倍,变为Delta_f/D;则要求采样长度相应的也应该是原来的D倍,D*N;而既然如此,
  直接经FFT得到的频谱,其实分辨率本身就是Delta_f/D。 ZoomFFT所做的, 只不过直接FFT计算点数是D*N,ZoomFFT通过巧
  妙的办法,使计算量仍旧是N;并且,只选取我们所关心的“频带”去计算。对我们而言,我们也可以直接FFT得到频谱后,
  只绘制我们关心的那个“频带”;相对该直接FFT方法,在获得信息上ZoomFFT没有任何增加;仅仅提高了效率(连这其实都值
  得商榷,如果我们同时有关心其他频率,ZoomFFT还得重算)。


  所以,我认为ZoomFFT的更确切的称呼,应该是“选带分析”,而非“细化分析”;当然这是沿用我理解的前面的细化的定义。
  ZoomFFT这一“手段”,在高性能个人数字计算机普及之前的分析仪器时代,对性能的提高意义是十分巨大的,因为那时,哪
  怕做一组512点的FFT,耗时都是很可观的;但现在,意义已经不再如过去那么显著;毕竟,在PC机上,计算哪怕是较长的FFT
  已经都是ms-秒级的时间。当然,目前来说ZoomFFT这一“手段”,对于存储量、计算能力相对弱的便携计算机/仪器而言,还是
  有意义的。补零确实不能提高客观实在的“物理分辨率”,可是好多振动信号处理领域的学者没有意识到这点.细化是针对FFT分
  析点数固定的情况下来说的.这在20年前计算机内存小,计算速度慢是有意义的,现在计算机速度快了.可以不用考虑细化技术了
  但是,在Fft出现栅栏效应时,可以有弥补作用
  
  8.到底该怎么实现“细化”?


  我理解,除非对原始信号进行外推或者就是认为采时间上更长的信号,再经FFT得到频谱,否则无法实现真正的“细化”。
  现代功率谱分析方法,隐含了对信号的外推,可以突破前述Delta_f=1/Delta_T的限制。


  9. 那CZT实现细化是怎么回事?


  将CZT用于细化仅仅是对频域进行插值;这与时域补零一样(实际可以证明时域补零跟频域插值是等效的),增加的还是
 “计算分辨率”。当然,这个方法,一些情况下可以有助于看到两个相近谱峰的“概貌”,也并非毫无意义。
    
  10. ”FFT谱“or”DFT谱“
 “FFT谱”这种说法不大严谨,是个很工程化的说法。毕竟FFT不是种新形势的变换,而是实现DFT的一个计算机算法。建议使
  用DFT谱,或者是离散频谱这样的说法
  
  11. 提高频率分辨率最实用的办法是采样更长时间的数据?


  正确。但是还要注意一个问题,采样数据不宜太长,太长的话,即使不考虑存储问题,直接通过FFT做出离散傅里叶频谱还
  会引起两方面问题:
    1.DFT没有考虑到系统的时变特性,太长时间里时不变假设还能否成立是个问题
    2.分析线数过高,分辨率过高的话;有用信号在频域上分得过细,从测量的角度噪声就可以更加趁虚而入了。 
      刘馥清教授曾在LMS的培训会上谨慎地建议1600线就可以了,再高的话意义不是太大。
 
  12.ZoomFFT改回它原本的称呼——选带分析吧! 不要再称为“细化”了
   
   Zoom FFT本来就叫做选带分析,不知道谁以讹传讹传成了“细化”分析,好像它可以突破测不准原理的限制,在不增加
   采样记录长度的情况下获得更高精度的谱似的。它只不过通过只计算所关心的一个窄频带,提高了运算效率而已,不要抱
   不现实的期望。
   现在普通PC机做2的20次方的FFT都已经可以瞬间完成,便携式仪器里面采用的高级硬件也越来越便宜,ZoomFFT已经越来
   越失去原来的意义。一个例子是,LMS的采集系统在2009已经取消了所谓的ZoomFFT功能;因为它一次运算只能分析一个
   窄频带,要看另一个频带还需要重新运算;意义很小很小了
  
 13. 频谱细化的一些知识及实现


  频率细化方法提出的背景:
  
  频率细化是70年代发展起来的一种新技术,其主要目的是识别谱图上的细微结构。从通常的FFT分析方法中我们已经知道,
  在频谱图上的有效频率分布范围是从0HZ到奈魁斯特频率fN为止,而谱线间隔(fs/N)决定了频率分辨能力,N表示数据点数,
  这里fs表示采样频率,且fN=fs/2。因此,要获得较高的分辨率可从下面两个方面进行。第一方面:降低采样频率,谱线间
  隔减小,但这样会降低奈魁斯特频率fN,从而导致频率分析范围小;第二方面:提高FFT计算长度N值,但这样要求较大的内
  存和降低运算速度。在内存和FFT计算长度N有限制的情况下,既要不降低频率分析范围fN,而又要增加频率分辨率是矛盾
  的,为此出现了基于不同原理的各种选频细化分析方法,例如,扫频窄带分析法、基于复调制的ZFFT法、直接选抽法、级联
  FFT法、相位补偿细化和最大频谱的局部表示法等。最为常用的是复调制ZOOMFFT,相位补偿细化和级联三种方法。然而在计算
  效率、精度和灵活性等方面都比较理想的方法还是基于复调制的Zoom-FFT,因此得到了较多的应用。
  
  几种常用细化方法的比较


   1.复调制Zoom-FFT
     
    复调制Zoom-FFT.输入信号为x(n),假设其频谱为|X(f)|,我们需要频率f0附近的频谱进行细微观察,则首先应对x(n)进行复调制,
    得到移频后的信号y(n),经过复调制后的信号y(n)的频谱是原来的频谱左移,欲观察的谱线已移至零频附近。这样就可以较低的
    频率对y(n)进行重新采样,为防止频谱混迭,在采样前应用理想低通滤波器进行滤波。
    具体阐述如下:
      (1)频移。为了将感兴趣的频段的下限频率移至原来的零频率位置,以便有可能将感兴趣频段放大到整个频率显示范围上,需
    首先对信号进行频率调制。这里采用的是复数调制法,如果欲将某一频率fo移至原来的零频处,则以原信号x1与exp(-j2pi*f0*k*∆t)
    相调制得:实部为 x1cos((2*pi*f0*k)/(N*∆f)),虚部为-x1sin((2*pi*f0*k)/(N*∆f))。若令L0=f0/∆f(∆f---原有的频率分辨率),
    即为频率在原频谱图中所对应的谱线序号,则实部和虚部即可以写为: x1cos(2*pi/N*L0*k)及 -x1sin(2*pi/N*L0*k),合并实部和
    虚部可以得到调制后的信号为 wn=exp(-j*2pi/N), 
      (2)滤波。数字低通滤波器是高截止特性的低通滤波器,可将从f0开始的一个所要求显示的窄频带f0到f1以外的所有频率成分滤掉,
    f0-f1仅为原截止频率的1/2^n(n=1,2,3,…),此处2^n即为细化倍数,称之为细化因子。
      (3)二次采样。二次采样是为了提高频率分辨率,使采样频率降至Fs/2^n(Fs是第一次采样的采样频率)。由采样定理可知,在采样个
    数仍为N时,采样频率下降为1/2^n,相当于总时间窗增长2^n倍,则频率分辨率亦将提高2n倍。这时的分辨率∆f’与原分辨率∆f之比为
    1/2^n,经二次采样后的信号,进行复数FFT,便得到了细化的频谱。由于细化2n倍时二次采样频率下降为原来的1/2^n,采样的记录长
    度亦应增至原来的2^n倍。应该指出,记录长度的增加仅在一次采样时增加了采样点数,而在完成二次采样后,点数仍为N,以后的FFT
    处理时间并未增加,因此,在细化2n倍时,计算时间并不会增加至2^n倍。当然,移频法也有其缺点,就是一次分析仅能使指定的一段
    频谱得到细化与分析,而其余则均滤去,如欲进行多频段或全部频率范围内的细化,则要一次一次地进行重采样,然后再作预处理和
    分析,很费时间。
 程序如下:


N=5120;
f=5120;
n=0:(N-1);
t=n/f;
x=sin(2*pi*50*t);
X=fft(x);
f=f*(0:N-1)/N;     %(0:N-1)/N。而不是(1:N-1)/N
subplot(2,1,1);
plot(f,abs(X)*2/N,'-'); %注意幅值的求解   
axis([0,115,0,1.2]);     
set(gca, 'XTickMode', 'manual', 'XTick', [0, 20,30,40,45,50,55,60,70,80,90,100,110,115]);
xlabel('Frequency');
ylabel('|F(k)|');
grid on;


f0=45;%移动的频率
h=exp(-j*2*pi*f0*t);
y=x.*h;%数字变频,把w=100点移动到原点
y1=resample(y,1,10);%重新采样,采样频率为fs/N
k1=0:1:511;
h1=exp((j*2*pi*f0*k1)/512);
y1=y1.*h1;%反移频,使得前后频率一致
y1=abs(fft(y1));%快速傅里叶变换
subplot(2,1,2);
plot(k1,y1*2/512);  %注意幅值的求解   
axis([45,55,0,1.2]);    
set(gca, 'XTickMode', 'manual', 'XTick', [45,46,47,48,49,50,51,52,53,54,55]);
title('细化10倍后的频率特性');
xlabel('频率');
ylabel('幅度值');
grid on;


注意:之所以在resample函数重新采样之前没有通过滤波器,是因为在程序中是利用了resample函数自带的滤波功能:
RESAMPLE applies an anti-aliasing (lowpass) FIR filter to X during the resampling process, and compensates for the
filter's delay.  The filter is designed using FIRLS.


   2.相位补偿细化
    
   相位补偿细化,可以对全部频率范围内的频谱进行细化,这就克服了频移法的缺点。当然,对于只需要在窄带范围内细化的情况,用相位
   补偿法有点浪费。设要求的细化因子为D=2^n,则采样个数为:N’=DN=DT/t,式中T—原分析长度,t—采样间隔。
   将相距D个采样间隔的样本抽出来集合为一个子序列,每个子序列有N个样本,共有D个子序列。总频谱是D次N点的FFT结果Xd相应乘以W^k DN
   后叠加的结果。这里的W^kDN即为谱线Xd的相位补偿量。
  
   3.级联Zoom-FFT


   假定样本数据是x(n+mN),n={0,…,N-1;m=0,…, M-1。其中数据序列被划分为M个区组,互不重叠。每一个区组有N个样本点。N*M点FFT的频
   率分辨率是:f=1/NMTS,运算量为NM log(NM)/2。N*M点的DFT可以简化成两次DFT,第一次DFT是对M个区组作N点DFT,而第二次DFT是对所关心
   的谱线k做M点DFT。总计算量为:(MnlogN+MlogM)/2,比上述计算量减少(N-1)MlogM/2。级联FFT与复包络解调法其实在本质上是类似的。

  事实上,ZFFT所谓的提高分辨率是指针对作同样点数的离散傅立叶变换而言的,即作细化D倍的N点细化谱实际上原始数据必须采DN点数据,
  这时候它比用N点原始数据直接做FFT而言频率分辨率提高了D倍,但如果把DN点原始数据全部做FFT,那它和细化谱的分辨率是一样的.一句话,ZFFT
  本质上可以说是一种快速算法,它通过滤波重采样来降低采样频率,这样就可以用较少点数的FFT来实现较高的频率分辨率,当然,提高速度的代价就
  是只能对局部频带进行细化(而如果将ZFFT利用的所有原始数据全部直接做FFT的话,它做出的是整个频域的,而且频率分辨率和细化后的一样,甚至
  如果考虑细化时滤波所需去掉的点,直接FFT的频率分辨率可以更高).