什么是窗函数?

article/2025/11/7 5:36:31

本文转自https://zhuanlan.zhihu.com/p/24318554

 

主要内容包括:

1. 为什么要加窗函数;

2. 窗函数的定义;

3. 窗函数的时频域特征;

4. 加窗函数的原则;

5. 模态测试所用窗函数;

6. 窗函数带来的影响。

 

1. 为什么要加窗

每次FFT变换只能对有限长度的时域数据进行变换,因此,需要对时域信号进行信号截断。即使是周期信号,如果截断的时间长度不是周期的整数倍(周期截断),那么,截取后的信号将会存在泄漏。为了将这个泄漏误差减少到最小程度,我们需要使用加权函数,也叫窗函数加窗主要是为了使时域信号似乎更好地满足FFT处理的周期性要求,减少泄漏。

如下图所示,若周期截断,则FFT频谱为单一谱线。若为非周期截断,则频谱出现拖尾,如图中部所示,可以看出泄漏很严重。为了减少泄漏,给信号施加一个窗函数(如图中上部红色曲线所示),原始截断后的信号与这个窗函数相乘之后得到的信号为上面右侧的信号。可以看出,此时,信号的起始时刻和结束时刻幅值都为0,也就是说在这个时间长度内,信号为周期信号,但是只有一个周期。对这个信号做FFT分析,得到的频谱如下部右侧所示。相比较之前未加窗的频谱,可以看出,泄漏已明显改善,但并没有完全消除。因此,窗函数只能减少泄漏,不能消除泄漏。

因此,加窗的目的是为了减少泄漏。

 

2. 窗函数的定义

信号截断时,只能截取一定长度,哪怕原始信号是无限长的,因此,好像是用一个“窗”(确切地说更像个“框”)去作这样的截取了。如下图所示,原始信号是周期信号,时间很长,截取时用红色的“窗”去截取这个周期信号,截取得到的信号如图中下部所示。

 

当然这个“窗”是一个单位权重的加权函数,称为“矩形窗”。

上图中用于截取信号的时域截取函数(就是上图中红色的那个“窗”)就称为窗函数,它是一种计权函数,不同的窗函数计权是不一样的。也就是说,可以用不同的截取函数(窗函数)来做信号截取。到底用何种窗函数基于信号类型和分析目的。常用的窗函数有矩形窗、汉宁窗、平顶窗、指数窗等。

 

3. 窗函数的时频域特征

加窗实质是用一个所谓的窗函数与原始的时域信号作乘积的过程(当然加窗也可以在频域进行,但时域更为普遍),使得相乘后的信号似乎更好地满足傅立叶变换的周期性要求。如下图所示,原始的信号是不满足FFT变换的周期性要求的,变换后存在泄漏,如果施加一个窗函数,会在一定程度上减少泄漏。为了减少泄漏,用一个窗函数与原始周期信号相乘,得到加窗后的信号为周期信号,从而满足FFT变换的周期性要求。

 

×

 

原始周期信号×窗函数

加窗后的信号

 

使用不同的时间窗,它的时域形状和频域特征是不相同的。在这,介绍三种常见的窗函数的时域表达形式,以及它们的时域窗形状和频域特征。这三种窗分别是矩形窗、汉宁窗和平顶窗。它们的时域表达形式如下表所示,并且假设时间窗的范围为0≤t≤T,如果时间t的取值区间不同,窗函数的表达形式也会略有差异。

矩形窗、汉宁窗和平顶窗的时域形状和频域特征如下图所示,可以看出,窗函数不同,时域和频域都是不同的。

 

为了减少泄漏,可采用不同的窗函数来进行信号截取,因而,泄漏与窗函数的频谱特征相关的。窗函数的典型频谱特征如下图所示:

窗函数的典型频谱特征

 

各种窗函数频谱特征的主要差别在于:主瓣宽度(也称为有效噪声带宽,ENBW)、幅值失真度、最高旁瓣高度和旁瓣衰减速率等参数。加窗的主要想法是用比较光滑的窗函数代替截取信号样本的矩形窗函数,也就是对截断后的时域信号进行特定的不等计权,使被截断后的时域波形两端突变变得平滑些,以此压低谱窗的旁瓣。因为旁瓣泄露量最大,旁瓣小了泄露也相应减少了。不同的窗函数具有不同的频谱特征,下表列出了一些常用窗函数的特征。

主瓣宽度主要影响信号能量分布和频率分辨能力。频率的实际分辨能力为有效噪声带宽乘以频率分辨率,因此,主瓣越宽,有效噪声带宽越宽,在频率分辨率相同的情况下,频率的分辨能力越差。如下图所示,红色为平顶窗(3.77∆f),黑色为汉宁窗(1.5∆f),蓝色为信号频率,可以明显地看出,主瓣越窄,频率分辨越准确。对于窗函数宽的主瓣而言,如果有邻近的小峰值频率,则越难辨别出来。

旁瓣高低及其衰减率影响能量泄漏程度(频谱拖尾效应)。旁瓣越高,说明能量泄漏越严重,衰减越慢,频谱拖尾越严重。对50.5Hz(频率分辨率为1Hz)的信号分别施加矩形窗(红色)、汉宁窗(绿色)和平顶窗(蓝色),用对数显示幅值,加窗后的结果如下图所示。从图中可以看出,矩形窗的频谱拖尾更严重。

相对而言,如果旁瓣能量较小,高度趋于零,使得信号能量相对集中于主瓣,则较为接近真实的频谱。不同的窗函数对信号频谱的影响是不一样的,这主要是因为不同的窗函数,产生泄漏的大小不一样,频率分辨能力也不一样。

 

4. 加窗函数的原则

加窗函数时,应使窗函数频谱的主瓣宽度应尽量窄,以获得高的频率分辨能力;旁瓣衰减应尽量大,以减少频谱拖尾,但通常都不能同时满足这两个要求。各种窗的差别主要在于集中于主瓣的能量和分散在所有旁瓣的能量之比。

窗的选择取决于分析的目标和被分析信号的类型。一般说,有效噪声频带越宽,频率分辨能力越差,越难于分清有相同幅值的邻近频率。选择性(即分辨出强分量频率邻近的弱分量的能力)的提高与旁瓣的衰减率有关。通常,有效噪声带宽窄的窗,其旁瓣的衰减率较低,因此窗的选择是在二者中取折衷。

因而,窗函数的选择一般原则如下

1. 如果截断的信号仍为周期信号,则不存在泄漏,无须加窗,相当于加矩形窗。

2. 如果信号是随机信号或者未知信号,或者有多个频率分量,测试关注的是频率点而非能量大小,建议选择汉宁窗,像LMS Test.Lab中默认加的就是汉宁窗。

3. 对于校准目的,则要求幅值精确,平顶窗是个不错的选择。

4. 如果同时要求幅值精度和频率精度,可选择凯塞窗。

5. 如果检测两个频率相近、幅值不同的信号,建议用布莱克曼窗。

6. 锤击法试验力信号加力窗,响应可加指数窗。


5. 模态测试所用窗函数

所有的窗函数都会使时域信号的开始和结束端归零。用于锤击试验的“力窗”和“指数窗”却是个例外。

力窗是单位增益的窗函数(实质是部分矩形窗),作用于脉冲激励发生的那部分时段。加力窗是为了消除可能来自于力锤激励通道的噪声。通常,设置力窗的宽度约为数据样本窗口的2-10%,使得力脉冲完全位于这个单位增益窗内,力窗之外的时域样本纪录则被加权置零。需要着重注意的是,力窗从来不能消除测试过程中可能出现的二次连击的影响。使用力窗消除连击所造成的影响,将严重扭曲输入力谱。

指数窗通常用于在采样时间长度内信号没有完全衰减到零的响应信号。指数窗的应用强制响应信号更好地满足FFT变换的周期性要求。通常,对于小阻尼结构,锤击激起的结构响应在采样时间长度的末端不会完全衰减到零。这种情况下,变换后的数据将遭受泄漏影响。为了将泄漏减少到最低程度,需要对测量响应数据施加指数窗,如下图所示。

对于锤击法测试,应尽量实现无泄漏的测量,即响应不需要加指数窗,因为加窗之后,相对而言,阻尼会是过估计,使得估计出来的阻尼大于实际的阻尼。因此,可以通过增加采样时间,使响应有足够的时间衰减,以避免加窗。

对于激振器测试最常用是矩形窗和汉宁窗。需要明白的是所有窗函数都会使数据失真。需要记住的是窗函数总是会使测到的峰值发生失真,并且总会给出这样的假象:测量得到的FRF中的结构阻尼大于结构实际存在的阻尼,而这两个非常重要的属性刚好是我们需要从FRF中估计的属性。矩形窗会使得幅值失真36%,汉宁窗失真16%。FRF的幅值失真从而使得阻尼估计不准确。

 

6. 窗函数带来的影响

窗函数会使信号幅值失真,那么窗函数对计算RMS值是否有影响呢?由于加窗使得频率峰值失真,因此,如果计算峰值处的RMS值,必然也是有影响的。如下图所示,由于峰值高低不一样,则对应的RMS也不一样。但如果计算窄带RMS或整个频带的总RMS值呢?

从上图可以看出,不同的窗函数下,计算19-87Hz内的总有效值都为0.71,因此,对于不同的窗函数下,计算总有效值是没有影响的。因为能量虽然泄漏到旁瓣上,但总的能量是不变的。

从第3小节中对比原始信号和加窗后的信号可以看出,信号的能量在起始和结束位置都计权置零,因而,从能量的角度来考虑,加窗后的信号能量要比加窗之前的能量小。因此,如果对信号施加了窗函数,则频谱还需要进行修正。修正分幅值修正和能量修正,如果是单条谱线则为幅值修正;如果是宽带则为能量修正。但需要记住一点,这个工作,通常商业软件会自动处理,无须人工处理,只需要知道有这么一步工作即可。

每个窗函数对数据的频域描述都有影响。一般而言,窗函数将降低函数峰值幅值的精度,并且使得最终得到的阻尼似乎比实际真实存在的阻尼要更大。尽管这些误差完全是不想要的,但相比泄漏造成的严重失真而言,它们还是更能让人接受。


http://chatgpt.dhexx.cn/article/97iQ8D9e.shtml

相关文章

窗函数总结

参考链接 文中第一、二节参考链接: 什么是泄漏? 文中第三节参考链接: 何时、何地应用何种的窗函数? 文中第四、五节参考链接: 窗函数概念知识点统计_teresa_zp的博客-CSDN博客_窗的主瓣宽度 一、为什么加窗 1. 周期函数的…

驱动irq

http://www.wowotech.net/irq_subsystem/irq-domain.html wowokeji 涉及目录: kernel/irq/ irqdomain.c irqdesc.c proc.c manage.c request_irq_thread定义 drivers/irqchip.c irq-gic.c(v2) irq-gic-common.c drivers/of/irq.c

irqbalance机制分析

本文档基于irqbalance-1.5.0 源码链接:https://launchpad.net/ubuntu/source/irqbalance/ 1. object tree Irqbalance是用户空间用于优化中断的一个工具,通过周期性的(默认10s)统计各个cpu上的中断情况,重新对中断进…

request_irq()

原文地址:http://blog.csdn.net/wealoong/article/details/7566546 一、中断注册方法 在Linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义: int request_irq(unsigned int irq, ir…

linux IRQ Management(六)- DTS及调试

了解DTS Interrupt 设置方式。 1.DTS 中 interrupt 描述 interrupt-controller - 一个空的属性定义, 该节点作为一个接收中断信号的设备。 #interrupt-cells - 这是一个中断控制器节点的属性。它声明了该中断控制器的中断指示符中 cell 的个数(类似于 …

Linux IRQ number和中断描述符

一、前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程。第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等。第三章描述中断描述符数据结构的各个成员。第四章描述…

irqbalance

http://www.bubuko.com/infodetail-1129360.html irqbalance 理论上: 启用 irqbalance 服务,既可以提升性能,又可以降低能耗。 irqbalance 用于优化中断分配,它会自动收集系统数据以分析使用模式,并依据系统负载状况…

linux irq 接口,Linux内核API irq_set_irq_type

irq_set_irq_type函数功能描述:此函数用于设置中断处理函数触发的类型,被操作的中断描述符保存在数组irq_desc中,对应的下标为参数irq的值,设置的中断触发类型为参数type所代表的类型。 irq_set_irq_type文件包含 irq_set_irq_typ…

Linux Irq domain

本节学习下什么是irq domain, 以及irq domain的作用。可以参考内核文档IRQ-domain.txt 为什么引入IRQ-Domain 当早期的系统只存在一个interrupt-controller的时候,而且中断数目也不多的时候,一个很简单的做法就是一个中断号对应到interrupt-contoller的…

linux IRQ Management(四)- IRQ Domain

了解IRQ Domain(中断控制器) 1.如何理解中断号? 每个IRQ同时有"irq"和"hwirq"两个编号。 "hwirq"是硬件中断号(物理中断号),即芯片手册上写的号码,Interrupt controller用hwirq来标识…

linux设备驱动:中断处理中的hardirq与softirq详细流程

中断处理的整体框架: 内核用于标识中断上下文(in_interrupt())的变量preempt_count的布局: 按照x86处理器在外部中断发生时的硬件逻辑,在do_IRQ被调用时,处理器已经屏蔽了对外部中断的响应。在图中我们看 到中断的处理大体上被…

Java 字段封装快捷键

快捷键:shift alt s 选择:

Java封装阿里云对象存储OSS

Java封装阿里云对象存储OSS 阿里云对象存储OSS官网 本篇博客简单封装了阿里云的OSS存储中的建立连接;本地文件,输入流和URL三种方式上传文件,获取文件的输入流,删除文件,获取所有文件列表等功能。 OSS官方Api OSSp…

java 枚举 封装操作方法

前言: 由于刚转java项目,所以对于java语言比较陌生,尤其是lambda和一些诸如(一个java文件只能有一个public class)等等的零散知识点之类。。。 使我觉得就语言的层级来说。.net真的超越java不是一星半点。奈何.net跨…

Java封装和封装的案例

Java封装和封装的案例 目录 一、Java封装知识点简介 二、Java程序中的包 三、static关键字、代码块 四、封装的综合应用案例: 一、Java封装知识点简介 1、面向对象三大特性之封装的概念: 隐藏类的某些内部细节,不允许外部程序直接访问…

Java的封装方法

在面向对象程式设计方法中,封装(英文名称:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的…

Java封装如何封装 封装的好处是什么?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、封装的作用是什么?二、封装的好处三、封装的步骤 1.引入库2.private的应用总结 前言 我要看电视,只需要按一下开关和换台就可以了。…

15、JAVA入门——封装

目录 一、封装 1、封装概述 2、封装的步骤 二、Java里的包 1、包的概述 2、包的定义 3、包的使用 4、注意事项 三、Java访问修饰符 1、类和类成员的访问控制 2、类的访问修饰符 3、类成员的访问修饰符 四、static关键字 1、static特点 2、static修饰属性 3、static修饰方法 4、…

初学java封装

封装 初识java封装 封装的用处: 1.提高程序的安全性,保护数据 2.隐藏代码的实现细节 3.统一接口 4.增加系统可维护性 这里创建一个类 public class Package {//属性私有private String name;//名字private int age; //年龄private int sex;//性别//1.…

java如何实现封装_java如何实现封装

Java中类的封装是如何实现的封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问对象内部的属性和方法。 java封装类通过三个步骤实现: (1)修改属性的可见性,限制访问。 (2)设置属性的读取方法。 (3)在读取属性的方法中,添加对属性读取的限制。 Java中什么叫封装呢? 继…