FFT、窗口化,DFT傅里叶、频谱

在这篇文章中将深入探讨窗口化,这可能是您偶尔会遇到的问题之一。

频谱分析复习

在我们深入了解细节之前,有必要快速回顾一下数字​​​​​​​频谱分析仪的工作原理。回想一下,频谱分析仪对信号进行采样,然后对这些样本执行离散傅里叶变换 (DFT) 以生成频谱。

DFT确定信号中存在的频率。该算法基于无限长输入的思想,这意味着如果您的输入是正弦波的单个周期(以下称纯正弦波):

sine

  正弦波的单周期

DFT实际上会将其视为无休止重复的正弦波:

sines

正弦波的无限循环

那么我们会得到只包含信号频率处的一个尖峰的频谱:

fft-sine

正弦波的DFT

这种理想状态的信号恰好与采样时间完美对齐。但是如果出现像下面这样的信号呢?

partial

正弦波的部分周期

DFT 会反复将其视为从最大值直接跳到零的信号:

discontinuity

不连续的正弦波

这与纯正弦波是完全不同的信号。你可能会期望它的DFT与我们上面看到的单个尖峰不同,事实上它是:

rectangle-f

具有不连续性的正弦波的 DFT

峰值在整个频域中被涂抹掉。本底噪声上升,并可能掩盖信号中存在的其他频率。所以我们需要减少这种影响并获得更干净的频谱。

为什么选择窗口化?

不连续的信号就好比是建造一条横贯大陆的铁路,在最后一英里发现两端不会完全对齐。那么就需要稍微弯曲轨道才能对接。

在频谱分析领域,这种弯曲被称为窗口化。窗口函数会改变您的信号,即在开头和结尾将其逐渐减小到几乎为零:

blackman-harris-t

窗口函数

于是DFT将看到这个新信号的无限次重复:

kaiser-t

重复的窗口功能

这种不连续性已经消除,但要付出代价,你看到的不再是原来的纯正弦波。相反,您看到的是一个反复脉冲的正弦波,就像调幅信号一样。下图所示的新频谱反映了这种差异:

kaiser-f

窗口信号的DFT

对比可以发现:频谱的大部分区域没有像以前那样被明显地抹除。可以看到现在它峰值更宽了,不再又高又尖锐。

窗口函数,又称窗口化

即我们选择扭曲的窗口形状,它可以决定我们在频谱中看到的扭曲类型。不同的窗口功能可针对不同的目标进行优化:更精确的振幅、更低的本底噪声等。

常用窗口函数

凯撒( Kaiser )

上面的示例窗口称为 Kaiser 窗口。Kaiser窗是一种在数字信号处理中常用的窗函数,它可以通过一个参数来调整主瓣宽度和旁瓣衰减程度。它在振幅精度、旁瓣距离和旁瓣高度等各种相互冲突的目标之间取得了平衡。

公式如下:

n 是当前样本点的索引,N 是窗口的总长度,Io​ 是第一类修正贝塞尔函数(也称为零阶贝塞尔函数), β(beta )是一个非负实数参数,用于控制窗口的形状。 

可以通过改变参数 beta 同时调整主瓣和旁瓣的宽度,这使得它在信号处理中非常灵活。当 beta 值较大时,主瓣会变宽,旁瓣的衰减也会更加显著;反之,当beta 值较小时,主瓣会变窄,旁瓣的衰减会减少。

在实际应用中,Kaiser窗通常用于需要同时考虑主频率成分的突出和旁频率成分的抑制时。选择此窗口通常会显示靠近本底噪声的信号,而其他窗口可能会遮挡这些信号。因此,许多频谱分析仪默认使用此窗口。

void kaiser_window(complex* a, int N, float beta) {
    for (int i = 0; i < N; i++) {
        float window_value = bessel_i0(beta * sqrt(1 - pow((2 * i / (N - 1) - 1), 2))) / bessel_i0(beta);
        a[i].re *= window_value;
    }
}

汉明(Hamming)和汉宁( Hanning)

这两个名称相似的 Hamming 和 Hanning窗口函数都具有正弦曲线。它们之间的区别在于,汉宁窗口在时域上的波形两端都接近零,从而消除了任何不连续性。汉明窗口在接近零时停止,信号仍将有轻微的不连续性。

在频域响应上,汉明窗能够更好地减少近处的旁瓣泄露,但对于稍远的旁瓣泄露比汉宁窗要严重一些。

hamming-t

  Hamming(墨) 和 Hanning(红) 窗户

这两个窗口都导致了宽峰值,但都有很好的低侧瓣:

hamming-f

  Hamming 和 Hanning 窗口信号的 DFT

在两者之间,汉明窗在消除就近的旁瓣方面做得更好,但在消除其余部分方面做得较差,适合于那些需要突出主频率成分并且能够容忍一定程度的旁瓣泄露的应用场合。由于它们的速度和足够好的噪声性能,这些窗口历来被用于语音通信。

汉宁窗的数学表达式为:

void hanning_window(complex* a, int N) {
	for (int i = 0; i < N; i++) {
		float window_value = 0.5 * (1 - cos(2 * pi * i / (N - 1)));
		a[i].re *= window_value;
	}
}

汉明窗的数学表达式为:

void hamming_window(complex* a, int N) {
    for (int i = 0; i < N; i++) {
        float window_value = (0.54 - 0.46 * cos((2.0 * pi * i) / (N - 1)));
        a[i].re *= window_value ;
    }
}

布莱克曼-哈里斯(Blackman-Harris)

Blackman-Harris窗口是汉明和汉宁窗口使用的正弦波方法的更精细版本,提供了较高的幅值精度。

blackman-harris-t

  Blackman-Harris窗口

得到的光谱具有较宽的峰值,但旁瓣抑制良好:

blackman-harris-f

Blackman-Harris 窗口信号的 DFT

是不是很像上面的凯撒窗。

如果需要非常精确的幅值识别,Blackman-Harris窗可能是一个不错的选择。然而,由于其主瓣较宽,旁瓣小,它在频率分辨率方面可能不如其他窗函数,各位可自行和汉宁窗或汉明窗做对比。

Blackman-Harris窗的数学表达式为:

代码就不写了。其中a0​,a1​,a2​,a3​ 是特定的系数,它们决定了窗函数的形状 。

平顶(Flat Top)

Flat Top窗的形状和以上都不同。可以看出它实际上越过了零线:

flat-top-t

Flat Top

可以看出频域中的峰值要宽得多,宽峰值比任何其他窗口都更接近信号的真实振幅:

flat-top-f

Flat Top窗口信号的DFT

也就是说Flat Top窗的主瓣稍宽,幅度的准确性更高。因此,如果您的首要任务是从频谱中测量信号的幅度时,Flat Top窗口是一个不错的选择。

Flat Top窗函数的数学表达式为:

矩形窗(Rectangular)

Rectangular窗口:它也是没有窗户的另一种说法。从技术上讲,该术语还包括从全强度突然下降到零(无锥形)的窗口,但在实践中,人们通常使用它来表示无窗口信号。

虽然主瓣比较集中,但是旁瓣较高,并有负旁瓣,导致变换中带进了高频干扰和泄漏,甚至出现负谱现象。所以矩形窗口作为通用窗口的用处不如其他窗口有用。但是,拿来查看瞬态信号​​​​​​​还是很好用的。

窗口系数

除了影响频谱的形状外,窗口还会影响采集时间。我们知道分辨率带宽-RBW(仪器区分彼此接近的信号的能力)和样本数量之间的权衡。RBW 越窄,需要的样本就越多。

我们可以将这种现象比作观察高速公路的交通。一辆车的速度越接近你自己的速度,你就越需要观察它才能判断它比你开得快还是慢。

这两个因素(采集时间和 RBW)通过一个简单的公式相关联:

window-factor

您可以将窗口因子视为窗口形状在时域中受挤压程度的度量。如果使用像 Flat Top 这样的窗口会挤出大量数据,您将不得不获取更多样本来弥补损失。

有兴趣可以查看以下内容:

Technical Review: No. 3 1987 "Windows to FFT Analysis (Part I)" (BV0031) (bksv.com)icon-default.png?t=N7T8https://www.bksv.com/media/doc/Bv0031.pdf

DFT理论 (berkeley.edu)icon-default.png?t=N7T8https://w.astro.berkeley.edu/~jrg/ngst/fft/dftideas.html#discrete_frequencies
频谱分析仪和射频信号分析仪 |泰克 (tek.com)icon-default.png?t=N7T8https://www.tek.com/en/products/spectrum-analyzers

A window into the frequency domain, part 3 - EDNicon-default.png?t=N7T8https://www.edn.com/a-window-into-the-frequency-domain-part-3/

  • 42
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值