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

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

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

波形见下图
2.png

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

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

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

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

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

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

我们制造一个长度为0.1秒的事件,即在波形中,中断原有的信号0.1秒,插入3KHz的单音。不论是3KHz,还是过渡频率,都没有超过奈奎斯特频率。
9.png

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

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

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

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

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

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

另外构建一个更短的事件,这次是1ms,频率依然是3KHz。
16.jpg

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

用少一些的点数看看。
18.png

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

最后,我们可以定义实时频谱仪的时间分辨率,它就是考虑重叠帧后,一次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之间会丢弃大量的原始数据,即使是连续的扫频信号,也会被显示成间断的点,因此不能用于这样的演示。

[修改于 9年0个月前 - 2016/02/05 13:13:22]

来自:电子信息 / 无线电
5
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
S.D.P
9年0个月前 IP:江西
807310
开始看了看,没明白论述什么,然后结合XXXXXXXXXXXXXXXXXXXXXXXX/t/78786,就稍微明白说的是什么了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
xhzz
9年0个月前 IP:天津
807489
不明觉厉,虎哥牛!
mark
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
xuplastic
8年11个月前 IP:广东
810253
那也就是时间分辨率和频率分辨率不可兼得

那么小波变换在工程上有实际应用吗
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
虎哥作者
8年11个月前 IP:四川
810259
引用 xuplastic:
那也就是时间分辨率和频率分辨率不可兼得

那么小波变换在工程上有实际应用吗
小波在频谱分析用仪表上没有应用,因为它的分辨率不均匀,在通用仪器领域并不比傅里叶变换有优势,其中一个原因是傅里叶变换可以通过提高采样速率来提高频率分辨率,弥补其劣势,对冲小波的优势。而在通用仪器中,采样速率是比较容易提高的(目前在不损失频率分辨率的前提下,FFT的时间分辨率可达亚微秒量级)。但是不排除在对数据进行后期处理的时候,为了提高某个局部频域的分析能力而采用到它,或者在某些专用仪器中用到它。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
.........
8年11个月前 IP:广东
810354
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
虎哥
专家 进士 学者 机友 笔友
文章
1556
回复
13447
学术分
39
2005/08/24注册,1时27分前活动

刘 虎

创新工程局主席

主体类型:个人
所属领域:无
认证方式:身份证号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}