本文主要介绍了对模拟信号进行频谱分析时所遇到的频谱泄露现象,探究导致频谱泄露发生的根本原因及其改善方法。文中以ADC性能指标的测试场景为例,简单探讨了对ADC的输出结果进行非周期截断所带来的影响。最后对模拟信号频谱分析时所遇到的问题作了一个简单的总结。
为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题:
对于第一个问题,计算机需要先把送入系统的模拟信号采样、量化转换为数字信号后,再利用离散傅里叶变换(DFT)计算原信号的频谱。FFT本质上是基于DFT的快速算法(为了描述简洁,下文不会对这两个名词加以区分,而是不加说明的混合使用)。
对于第二个问题,考虑到运算量或实时处理系统的要求,通常会把实际采集到的信号数据截断成一帧一帧的数据块分别进行DFT分析。如果被截断的信号自身原来是周期信号,则根据截断方式的不同可以分为周期截断(也称为相干采样)和非周期截断(也称为非相干采样)两大类。周期截断是指截断后的信号恰好包含原信号的一个或多个整周期,不满足则称为非周期截断。
先从时域角度理解周期截断和非周期截断会对DFT的分析造成什么影响。直观上DFT其是对截断的信号进行离散时间傅里叶变换(DTFT)后在频域采样并取主值周期得到的。对下图正弦信号周期截断进行DFT分析,反应到时域相当于把截断后的信号进行周期搬移并拼接组成新的信号(DFT对DTFT的频域采样对应时域周期),此时得到信号和原信号依旧相同
但如果进行了非周期截断(如下图所示),拼接后的信号和原信号不再相同。这也就意味着新生成的信号包含了与原信号频率不同的新成分,即发生了频谱泄露现象
接下来再从频域角度观察上述过程。对原信号进行时域截断,从频域上看等价于将原信号频谱与截断窗函数频谱进行卷积,卷积的过程自然会导致原信号频谱会发生变形。
为了分析ADC性能指标,一种常见的做法是往输入端送入一个已知频率的正弦信号,然后对此时的输出结果采样并进行FFT分析。单频正弦周期信号原始频谱为如下图所示
如果上述采样截断的过程是非周期截断,则FFT后得到的信号频谱如下图所示,可以发现原信号频谱开始拖尾并变宽。这自然会影响后续对ADC性能指标的分析
非周期截断等价到对ADC输出结果采样参数选择上相当于此时截取信号总时长满足:N*Ts = K * Tin,K不为整数(Ts是采样间隔,Tin是输入信号周期,N是采样点数)。假定随后也进行N点DFT(一般默认DFT的点数等于采样点数,这也是频域采样避免时域混叠所要求的最小点数),则DFT后频谱图中的频谱间隔为Fs/N,而Fin = K * Fs/N(Fin是输入信号频率,Fs是采样频率),即输入信号不在频率分辨率Fs/N的整数倍上。这也意味着在采样后的DFT频谱图中,没有一条谱线可以与原信号的频率成分完全相同。举一个不太恰当的比方,为了弥补这种频率不相等,需要用多个接近原信号频率的成分组合以近似原信号频率成分(但是实际上此时频谱泄露的根本原因在于时域乘积等价于频域卷积,使得原信号频谱发生变形)。故上述频谱图中峰值处的频率也只是与原始信号的频率相近,但并不相同。
在此更加深入对比区分一下DTFT和DFT。对于采样前原信号是单频点周期信号cos(w0*n),其时域采样后的频谱是下图右1中的周期冲激序列串(时域抽样对应频域周期),其被矩形窗截断后,原信号与矩形窗在时域乘积反应在频域为两信号频谱的卷积(矩形窗函数的频谱如下图右2所示,是Sinc函数)。因而原来单频输入频谱发生了频谱泄露,变为了下图右3中周期Sinc函数的叠加,这一连续频域谱也就是DTFT的结果,也就是说如果单看DTFT的频谱结果,只要进行了时域截断,就必然会导致频谱泄露现象的发生,不过通过改变窗函数的类型,也就是改变窗函数对应的频谱,可以抑制窗函数与原信号频谱卷积对原信号频谱的影响程度。
而DFT的结果直观上来看是对截断后信号DTFT的结果再进行频域抽样后取主值周期得到的结果(频域抽样对应时域周期)。但经过频谱采样后,如果频域的采样点除了信号所在频带外,其他采样点恰好在Sinc函数的过零点,则最终DFT频谱图上也就观测不到Sinc函数的起伏。
简单总结一下,DTFT后的频谱是连续谱(且以数字角频率2п为周期),但DFT后的频谱是离散谱,以数字角频率2п/N为谱线间隔,N为采样点数一般也为截断时窗函数的长度。计算机因为计算能力和存储深度受限,其无法处理连续信号(连续信号可以近似认为是点数无穷多的离散信号构成),只能处理抽样量化后的数字信号。故实际应用观察的应是DFT而非DTFT的结果。FFT本质是基于DFT的一种快速算法,帮助加快运算速度而诞生的。
接下来简单从数学公式的角度描述上述现象,cos(w0*n)的DTFT为
π ∑ k = − ∞ ∞ [ δ ( ω − ω 0 + 2 π k ) + δ ( ω + ω 0 + 2 π k ) ] \pi\sum_{k=-\infty}^{\infty}\left[\delta\left(\omega-\omega_0+2\pi k\right)+\delta\left(\omega+\omega_0+2\pi k\right)\right] πk=−∞∑∞[δ(ω−ω0+2πk)+δ(ω+ω0+2πk)]
上式中k为整数。矩形窗函数RN(n) = [ u(n) – u(n-N) ]的DTFT为
e − j ( N − 1 ) ω / 2 s i n ( ω N / 2 ) s i n ( ω / 2 ) e^{-j(N-1)\omega/2}\frac{sin(\omega\ N/2)}{sin(\omega/2)} e−j(N−1)ω/2sin(ω/2)sin(ω N/2)
由于无法处理无限长的信号,我们需要对信号进行截断,即将原信号与矩形窗函数相乘cos(w0*n) * RN(n),截断后信号的DTFT为
e − j ( N − 1 ) ω / 2 s i n ( ω N / 2 ) s i n ( ω / 2 ) ∗ π ∑ k = − ∞ ∞ [ δ ( ω − ω 0 + 2 π k ) + δ ( ω + ω 0 + 2 π k ) ] e^{-j\left(N-1\right)\omega/2}\frac{sin\left(\omega N/2\right)}{sin\left(\omega/2\right)}\ \ast\ \pi\sum_{k=-\infty}^{\infty}\left[\delta\left(\omega-\omega_0+2\pi k\right)+\delta\left(\omega+\omega_0+2\pi k\right)\right] e−j(N−1)ω/2sin(ω/2)sin(ωN/2) ∗ πk=−∞∑∞[δ(ω−ω0+2πk)+δ(ω+ω0+2πk)]
简单起见,可以只观察其中一个单位抽样序列与矩形窗函数的卷积(k = 0),结果为
e − j ( N − 1 ) ω / 2 s i n ( ω N / 2 ) s i n ( ω / 2 ) × π × [ δ ( ω − ω 0 ) + δ ( ω + ω 0 ) ] e^{-j\left(N-1\right)\omega/2}\frac{sin\left(\omega N/2\right)}{sin\left(\omega/2\right)}\times\pi\times\left[\delta\left(\omega-\omega_0\right)+\delta\left(\omega+\omega_0\right)\right]\ e−j(N−1)ω/2sin(ω/2)sin(ωN/2)×π×[δ(ω−ω0)+δ(ω+ω0)]
而当
( ω − ω 0 ) N 2 = π k , a n d ω ≠ ω 0 \frac{\left(\omega-\omega_0\right)N}{2}=\ \pi k,\ and\ \omega\neq\omega_0 2(ω−ω0)N= πk, and ω=ω0
有
sin ( ( ω − ω 0 ) N / 2 ) sin ( ( ω − ω 0 ) / 2 ) = 0 \frac{\sin{\left(\left(\omega-\omega_0\right)N/2\right)}}{\sin{\left(\left(\omega-\omega_0\right)/2\right)}}=0 sin((ω−ω0)/2)sin((ω−ω0)N/2)=0
故可得
sin ( ( ω − ω 0 ) N / 2 ) sin ( ( ω − ω 0 ) / 2 ) = 0 , f o r ω = 2 π k N + ω 0 a n d ω ≠ ω 0 \frac{\sin{\left(\left(\omega-\omega_0\right)N/2\right)}}{\sin{\left(\left(\omega-\omega_0\right)/2\right)}}=0\ \ ,\ \ for\ \omega\ =\ \frac{\ 2\pi k}{N}+\omega_0\ and\ \omega\neq\omega_0 sin((ω−ω0)/2)sin((ω−ω0)N/2)=0 , for ω = N 2πk+ω0 and ω=ω0
k为整数,N为矩形窗函数的长度,默认也为后续进行DFT时在频域的总采样点数。假定截断满足周期截断,并对截断后的结果进行N点DFT,则频谱间隔为2п/N(从数字角频率的角度),且周期截断保证了
ω 0 2 π = f 0 f s = K N , ω 0 = 2 π K N \frac{\ \omega_0}{2\pi}=\frac{\ f_0}{f_s}=\ \frac{\ K}{N},\ \ \omega_0=\ 2\pi\ \frac{\ K}{N} 2π ω0=fs f0= N K, ω0= 2π N K
f0是原信号频率,fs是采样频率,w0是该进行采样后对应的数字角频率,K为整数,N为矩形窗函数的长度。
故DFT后其自变量离散数字角频率均满足
ω = A 2 π N = 2 π N ( k + K ) = 2 π k N + ω 0 \omega=\ A\frac{2\pi}{N} \ =\ \frac{\ 2\pi}{N}\left(k+K\right)\ =\ \frac{\ 2\pi k}{N}+\omega_0 ω= AN2π = N 2π(k+K) = N 2πk+ω0
其中A为整数表示DFT对DTFT中的第(A+1)个采样点。从DFT频域分量表示可以看出,其和DTFT中的过零点恰好相同,因而除了w = w0时,其余时刻DFT的幅值均为0,也即截断后信号的DTFT频谱发生了变形,但DFT是对DTFT频谱进行采样得到,其除了原来信号频谱峰值采样到外,其余采样点恰好在原信号与窗函数卷积后频谱的过零点,从而避免了在DFT的频谱结果中看到频谱泄露现象。这种区别可以直观的从下图曲线中观测到,无论是否进行了周期截断两者得到的DTFT结果都是虚线所示,但如果观测DFT的结果即下图中圆圈表示的频谱(上侧进行了周期截断,下侧是非周期截断),会发现周期截断DFT后观测不到DTFT中发生的频谱泄露现象。
如下便是一个具体的例子:原信号是1 kHz的正弦信号,利用8 kHz时钟进行采样,采样后的离散信号为x(n) = cos(n*п/4)。假定对采样得到的信号进行32点截断,时域上相当于利用32点矩形窗函数R32(n)与x(n)相乘,频域上对应两者信号频谱进行卷积(如下图上侧所示,即DTFT后的频谱),然后在以8kHz/32(数字角频率对应2*п/32)为间隔进行频谱采样如下图下侧所示
因而最终DFT得到的频谱结果如下图所示
结合以上分析,在ADC性能测试时还是考虑前面提到的典型测试场景,在输入端送入一个已知频率(如Fin)的单频输入周期信号。通过合理设置测量参数保证截断得到的输入信号包含原信号周期的整数倍,即进行周期截断(对该单频输入周期信号来说也就是要求采样结束点恰好对应采样开始点前一个序号的值)。这也意味着在对ADC输出数据进行FFT分析时要满足N * Ts = K * Tin(也即N*Fin = K*Fs),K为整数。上述表达式表示对ADC的输出结果以Ts为间隔进行采样,总共采样N个点进行截断,得到的结果包含输入信号的K个整周期。
接下来用cadence对ADC的输出码流进行FFT分析,对比非周期截断和周期截断后所观察到的结果有何不同。此案列中ADC的采样频率Fs设为1M,输入信号频率Fin为Fs*59/128 = 460.9375 kHz。先进行周期截断,采样128个点对应于采样总时长为128us(共包含59个信号完整周期),其对应的FFT结果如下图所示,可以看到输出结果中确实是460.9375 kHz占频谱中的主要成分,此时SNR =62dB
如果修改采样点数为127,此时得到的采样总时长为127us,不能包含输入信号的整周期倍,也就是对输入信号进行了非周期截断,得到的FFT结果如下图所示。由于此时的频谱间隔为1 MHz/127,输入信号的频率不为频谱间隔的整数倍,因而此时的FFT结果中没有一条谱线能够代表原输入信号。得到的SNR = -1.3 dB严重偏离预期值。
以上分析均是假定输入是已知频率的单频周期信号,而现实世界中在做FFT分析时可能无法预知输入进来的激励是什么样的信号(输入信号频率是未知的,送入的信号可能包含多个周期信号叠加),故实际中很难保证进行周期截断,因此泄漏不可避免。为了将这个泄漏误差减小到最小程度,需要使用加权函数,即更换原来所使用的简单矩形窗函数,使用更复杂的窗函数对原信号进行截断,也就是所谓的加窗。下图便是一个例子对一单频输入信号进行采样截断,图片上半部分是利用了矩形窗截断,下半部分是利用三角窗截断。可以看出三角窗截断得到的DTFT结果中频谱泄露现象要比矩形窗结果有了一定改善(能量主要集中在信号频率周围,非信号频率外的能量成分被衰减),但是依旧产生了原本不存在的频率成分。
回到之前用cadence对ADC的输出码流进行FFT分析,接着非周期截断的结果。但此时把rectangular矩形窗改用blackman窗,重新得到的FFT结果如下图所示。从频谱图中可以看出大部分频率成分低于0 dB,频谱泄露现象得到了缓解,此时得到的SNR = 40dB,但和周期截断得到的结果还是存在一定的偏差。
如果要在DFT分析中彻底避免频谱泄露现象,回想加窗在频域对应的是原信号与窗函数频谱卷积,为了避免信号频谱卷积后发生变形需要窗函数的频谱是单位脉冲序列,这也意味着其在时域是无限长的矩形窗,这显然和所要实现的信号截断相违背。
不同于ADC性能测试中可能更关心的是单频点的输入信号频谱是否发生频谱泄露,实际频谱分析时可能更关心的是不同频率分量之间的能量相对大小。也就意味着输入信号中需要关心多个不同频率的频谱分量,而且事先并不确定所关心的信号频率具体值,故无法通过周期截断避免频谱泄露的影响。此时除了通过加窗抑制频谱泄露外,还可以在采样时尽可能采样多的点进行FFT分析,即截取的时域序列x(n)长度N值取大一些。这样即使FFT频谱中没有对应信号的频点,但由于频谱中频率分辨率fs/N变小,也可以一定程度削弱频谱泄漏的影响。
再次回到之前用cadence对ADC的输出码流进行非周期截断的结果,这一次依旧采样普通矩形窗,但改用更多的采样点数(从先前的127点改为4095个点,4095*Fs*59/128/Fs 依旧不为整数)。此时维持了非周期截断,但由于采样点数变多频谱间隔变小,远离信号频率处每一点的频谱能量发生了相对衰减(从之前的30dB变为0dB)。不过由于此时的信号频率仍然不是频谱间隔Fs/4095的整数倍,故分析得到的SNR依旧不高,仅为 -0.54 dB。
最后对模拟信号进行频谱分析所遇到的问题作一个小结:
因笔者水平有限,如有错误还请批评指正!
参考文献:
[1] “什么是频谱泄露.” https://mp.weixin.qq.com/s/aLSmlrgQF7FBxh_YXXfq6w (accessed.
[2] 万永菁. “数字信号处理.” http://coursehome.zhihuishu.com/courseHome/1000006581/116316/17#teachTeam (accessed.
[3] Georgii Baranov. Spectral Analysis Algorithm for the Diagnosis of Electrical Machines