关于FFT实时频谱的几个基本概念

实时频谱图通常由快速傅里叶变换得来。我们知道,传统的扫描频谱在任一瞬间其实只能接收某个特定频率的信号,如果扫描到这个特定点的时候,该信号刚好没有出现,则会被遗漏。因此,不能用扫描频谱仪来捕捉快速跳频信号。当用来观察其它调制信号的时候,看到的也不是该调制信号的真实频谱。例如,对于单音调频信号,事实上任意瞬间,只存在一个频率。但是用扫描频谱来观察时,只有当信号的瞬间频率和频谱仪的瞬间频率恰好靠近时,才能被频谱仪检测。根据扫描速度的不同,同一个调频信号可以出现“多种”频谱。而实时频谱仪的数据来源,是整个通频带的IQ信号,该信号符合奈奎斯特定理,所以不会丢失任何信息。这样看来,只要偶发事件(例如一个跳频点)的持续时间,长于奈奎斯特定理规定的极限(二分之一采样率的倒数),那么实时频谱就必然能发现它。事实是这样的吗?

我们用有波形界的photoshop之称的音频编辑软件Adobe Audition(原来叫做cooledit)来加以演示。大家也可以自己装上这个软件玩一玩。

首先需要生成一个信号。我们生成的是1KHz和2KHz的双音。先用很高的采样率(1.2MS)来生成。

波形见下图

我们来对它进行一个傅里叶分析。采用凯撒窗口,FFT点数高达16384点。

这是FFT的结果。可以看到,频谱的频率分辨率非常糟糕,分辨率带宽(RBW)高达100Hz,请注意右侧的坐标。

这是因为采样率太高造成的。1.2M的采样率,FFT结果能实现0-600KHz的频谱,对于2KHz的信号,所占的比例就非常少,即使采用了1.6万点的FFT,也只能在很少的点上有反映,加窗以后,频率分辨率就非常低。
为了看到更清晰的谱图,必须减小RBW。方法是增大FFT点数,或者降低采样率。由于软件最大只能1.6万点,所以只剩下降低采样率一条路。考虑到我们的信号频率非常低,选用12KS的采样率就足够了。

生成新波形,依然是1KHz,2KHz双音。

对新波形做1.6万点FFT。可以看到,谱线非常细,与背景噪声的反差也不显著。通过降低采样率,的确显著的提高了频率分辨率。在1.2M采样率时,1.6万点仅仅相当于不到2毫秒,才覆盖了不到2个周期。而12K采样率时,同样的点数已经覆盖了200个周期。

把FFT的点数修改为1024点,可以看到反差显著的增加,且谱线变粗。

我们制造一个长度为0.1秒的事件,即在波形中,中断原有的信号0.1秒,插入3KHz的单音。

我们用1.6万点来做FFT,得到下面谱线。请务必注意横坐标,插入的事件长度为0.1秒,但受影响的时间高达2秒。在这两秒内,中断的1KHz和2KHz单音从未消失,新出现的3KHz单音虽能显示,但是不论宽度还是幅度,都是错误的。这就说明,1.6万点FFT的时间分辨率极低,尽管它有很好的频率分辨率。
由于这种谱线是不正确的,所以并不能认为实时频谱“发现了”3KHz的事件。

把FFT点数修改为1024点。谱线显著的变胖了,也就是说频率分辨率降低。从横坐标来看,时间分辨率提高了,而且有一瞬间,1KHz和2KHz单音基本消失,而3KHz单音比较突出的显示出来。1024点对应的时间长度大约为0.1秒,可以认为对于12KS采样率来说,1024点是能够基本正确的分辨0.1秒事件的最大点数。

其实1024点的幅度依然不够准确。因为1024个采样点,有很大可能包含了事件还没发生时的数据,也有很大可能包含了一些事件已经结束后的数据。如果FFT是一段一段逐步进行的,那么,如果希望这1024个点总有一次只包含“纯净”的事件,那么事件长度至少应当是1024个点所占时间的2倍,也就是0.2秒。反过来看,如果只有512个点,就能符合这个2倍关系,如下图。

当然,如果不想过多的降低FFT点数,还有一个办法是不要以总点数为分段,而是用类似“先进先出”的方法。比如,一次新加入128个采样点,吐掉128个采样点。这样做的后果是FFT的次数会增加8倍(如果总长度为1024的话),增加8倍的计算量。但是它能提高出现“纯洁”事件的概率。这就是“重叠帧”技术。当重叠帧的“重叠”量无限增大时,就能把上述2倍关系,变成刚好1倍。当然不可能无限重叠,根据DSP或者FPGA的运算速度,通常只能做到50%重叠帧。
下面的图是更小的FFT点数的结果。
128点

64点,可以看到频率分辨率严重降低,已经到了快要分不清三个频率的地步,但时间能够更精确的表现。

下图是采用了矩形系数更好的汉明窗的结果(128点)。调整不同的窗函数能够稍微改善频率分辨率,但是很明显,底噪增加了。

另外构建一个更短的事件,这次是1ms。

对它做1.6万点FFT。注意横坐标,此时,完全看不到3KHz的事件,而1KHz和2KHz的断点也完全无法看到。整个底部都受到了污染。

用少一些的点数看看。

这是能分清双音的极限(64点)。在图中,可以知道发生了事件,但是通过这个图,无法对事件的性质进行任何判断。因此可以认为该频谱仪对0.01秒的事件其实无能为力。

最后,我们可以定义实时频谱仪的时间分辨率,它是考虑重叠帧后,一次FFT较上一次FFT所新吞吐的原始数据所代表的时间长度。而100%捕获时间(POI)指标,是考虑重叠帧以后,能够“纯净的”落在一次FFT长度之内的事件的最短时间。

上述两个概念都有一个前提,事件必须能被显示器用不同灰度或颜色区分开。显示器的刷新率是有限的,通常最多也就60帧左右。而短的FFT点数意味着FFT的次数极多,可能每秒上百万次。这样多的次数即使能被显示,人眼也看不见。为了解决这个问题,人们用显示器的第三个维度——亮度或者颜色来代表FFT谱线在同一位置出现的多少,从而发明了余辉显示技术。

用降低FFT点数的方法能够显著提升时间分辨率和捕获概率,但是,会显著的恶化频率分辨率(分辨带宽,RBW)。如果一个频谱仪标出1μs的100%POI,而此时FFT点数是128点(对于40M带宽而言,频率分辨率1.5MHz)——那么基本上就是在用单个奇高的指标来耍流氓了。

上面是用波形分析软件进行的演示。对于HDSDR和SDR#这样的SDR软件,它的FFT本身就不是连续的,两次FFT之间会丢弃大量的原始数据,即使是连续的扫频信号,也会被显示成间断的点,因此不能用于这样的演示。

发表评论