窗函数作用和性质

article/2025/11/7 5:02:30

文章目录

  • 什么是窗函数?
  • 窗函数的作用是什么?
    • 1.防止泄露
    • 2. 分析意义
  • 有哪些常用的窗函数?它们特点是什么?
    • Rectangular
    • Hanning
    • Hamming
    • Blackman
    • Blackman-Harris
  • 总结

什么是窗函数?

窗函数能够产生一段特定的信号,假定为w

我们假设一段信号为x,给这段信号加窗,指的是将x乘上w

下面的代码说明了这个过程

import numpy as np
from scipy.signal import get_window
import matplotlib.pyplot as plt
%matplotlib inlineM = 128                                     # 信号的长度
x = np.cos( np.linspace(0, 8*np.pi, 128) )  # 生成一段cos信号
w = get_window('hanning', M)                # 调用窗函数,生成w(hanning是一种窗函数)xw = x*w                                    # 加窗plt.figure(figsize=(10,10))
plt.subplot(311)
plt.plot(x);plt.title('Input signal')
plt.subplot(312)
plt.plot(w);plt.title('Haning window')
plt.subplot(313)
plt.plot(xw);plt.title('Windowed signal')plt.show()

png

窗函数的作用是什么?

1.防止泄露

关于泄露,参见什么是泄漏?

在信号处理中,我们通常对信号进行截断分析,如果信号截断为非周期截断,那么频谱将发生泄露。通过加窗,可以减少频谱的泄露。我们可以这么想象,窗函数可以将一个非周期的信号,强行变成一个周期的信号。

下面的代码展示了什么是泄露,以及窗函数可以减少泄露
可以从(c)和(d)的对比中看到,加窗后可以有效的减少泄露

import numpy as np
from scipy.signal import get_window
from scipy.fftpack import fftimport matplotlib.pyplot as plt%matplotlib inlineM = 128                                           # 信号的长度
x = np.cos( np.linspace(0, 80.7*np.pi, 128) )     # 生成一段非周期信号
w = get_window('hanning', M)                      # 调用窗函数,生成w(hanning是一种窗函数)X = fft(x)
mX = np.abs(X)xw = x*w                                          # 加窗
XW = fft(xw)
mXW = np.abs(XW)plt.figure(figsize=(12,12))
plt.subplot(321)
plt.plot(x);plt.title('(a)Input signal')
plt.subplot(322)
plt.plot(xw);plt.title('(b)Windowed signal')
plt.subplot(323)
plt.plot(mX);plt.title('(c)Amplitude of unwindowed signal')
plt.subplot(324)
plt.plot(mXW);plt.title('(d)Amplitude of windowed signal')plt.show()

png

2. 分析意义

一个加窗后的信号,它的傅里叶变换结果可以表示为窗函数的傅里叶变换。非常神奇的性质,并且在信号分析中非常重要,见如下证明

trans_of_window_sinewave

有哪些常用的窗函数?它们特点是什么?

窗函数有很多很多种,Scipy中的get_window提供了多种窗函数的实现,具体请参看scipy.signal.get_window

每种窗函数都可以由两个特征来区别:主瓣的宽度(main-lobe width)和副瓣最大高度(side-lobe level)

analysis_window

下面介绍几种常用的窗函数

Rectangular

w [ n ] = { 1 , n=-M/2,...,0,...,M/2 0 , n=elsewhere w[n] = \begin{cases} 1, &\text{n=-M/2,...,0,...,M/2}\\ 0, &\text{n=elsewhere} \end{cases} w[n]={1,0,n=-M/2,...,0,...,M/2n=elsewhere

W [ k ] = π k π k / M W[k] = \frac{\pi k}{\pi k/M} W[k]=πk/Mπk

main-lobe width: 2 bins

side-lobe level: -13.3db

from scipy import signal
from scipy.fftpack import fft, fftshift
import matplotlib.pyplot as pltwindow = signal.boxcar(51)
plt.plot(window)
plt.title("Boxcar rectangular window")
plt.ylabel("Amplitude")
plt.xlabel("Sample")plt.figure()
A = fft(window, 2048)
freq = np.linspace(-0.5, 0.5, len(A))
response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
plt.plot(freq, response)
plt.axis([-0.5, 0.5, -120, 0])
plt.title("Frequency response of the boxcar window")
plt.ylabel("Normalized magnitude [dB]")
plt.xlabel("Normalized frequency [cycles per sample]")

png

png

Hanning

w [ n ] = 0.5 + 0.5 ∗ cos ⁡ ( 2 π n / M ) w[n] = 0.5+0.5*\cos (2\pi n/M) w[n]=0.5+0.5cos(2πn/M)
W [ k ] = 0.5 D [ k ] + 0.25 ( D [ k − 1 ] + D [ k + 1 ] ) , D [ k ] = sin ⁡ ( π k ) π k / M W[k] = 0.5D[k] + 0.25(D[k-1] + D[k+1]), D[k] = \frac{\sin (\pi k)}{\pi k/M} W[k]=0.5D[k]+0.25(D[k1]+D[k+1]),D[k]=πk/Msin(πk)

main-lobe width: 4 bins

side-lobe level: -31.5db

window = signal.hanning(51)
plt.plot(window)
plt.title("Hanning window")
plt.ylabel("Amplitude")
plt.xlabel("Sample")plt.figure()
A = fft(window, 2048)
freq = np.linspace(-0.5, 0.5, len(A))
response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
plt.plot(freq, response)
plt.axis([-0.5, 0.5, -120, 0])
plt.title("Frequency response of the Hanning window")
plt.ylabel("Normalized magnitude [dB]")
plt.xlabel("Normalized frequency [cycles per sample]")

png

png

Hamming

w [ n ] = 0.54 + 46 ∗ cos ⁡ ( 2 π n / M ) w[n] = 0.54+46*\cos (2\pi n/M) w[n]=0.54+46cos(2πn/M)

main-lobe width: 4 bins

side-lobe level: -42.7db

window = signal.hamming(51)
plt.plot(window)
plt.title("Hamming window")
plt.ylabel("Amplitude")
plt.xlabel("Sample")plt.figure()
A = fft(window, 2048)
freq = np.linspace(-0.5, 0.5, len(A))
response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
plt.plot(freq, response)
plt.axis([-0.5, 0.5, -120, 0])
plt.title("Frequency response of the Hamming window")
plt.ylabel("Normalized magnitude [dB]")
plt.xlabel("Normalized frequency [cycles per sample]")

png

png

Blackman

w [ n ] = 0.42 − 0.5 cos ⁡ ( 2 π n / M ) + 0.08 cos ⁡ ( 4 π n / M ) w[n] = 0.42 - 0.5\cos(2\pi n/M) + 0.08\cos(4\pi n/M) w[n]=0.420.5cos(2πn/M)+0.08cos(4πn/M)

main-lobe width: 6 bins

side-lobe level: -58db

window = signal.blackman(51)
plt.plot(window)
plt.title("Blackman window")
plt.ylabel("Amplitude")
plt.xlabel("Sample")plt.figure()
A = fft(window, 2048)
freq = np.linspace(-0.5, 0.5, len(A))
response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
plt.plot(freq, response)
plt.axis([-0.5, 0.5, -120, 0])
plt.title("Frequency response of the Blackman window")
plt.ylabel("Normalized magnitude [dB]")
plt.xlabel("Normalized frequency [cycles per sample]")

png

png

Blackman-Harris

w [ n ] = 1 M ∑ i = 0 3 α i cos ⁡ ( 2 n / π / M ) , α 0 = 0.35875 , α 1 = 0.35875 , α 1 = 0.35875 , α 3 = 0.35875 w[n] = \frac{1}{M}\sum_{i=0}^{3} \alpha_i \cos(2n/\pi/M), \alpha_0=0.35875, \alpha_1=0.35875, \alpha_1=0.35875, \alpha_3=0.35875 w[n]=M1i=03αicos(2n/π/M),α0=0.35875,α1=0.35875,α1=0.35875,α3=0.35875

main-lobe width: 8 bins

side-lobe level: -92 db

window = signal.blackmanharris(51)
plt.plot(window)
plt.title("Blackman-Harris window")
plt.ylabel("Amplitude")
plt.xlabel("Sample")plt.figure()
A = fft(window, 2048)
freq = np.linspace(-0.5, 0.5, len(A))
response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
plt.plot(freq, response)
plt.axis([-0.5, 0.5, -120, 0])
plt.title("Frequency response of the Blackman-Harris window")
plt.ylabel("Normalized magnitude [dB]")
plt.xlabel("Normalized frequency [cycles per sample]")
<matplotlib.text.Text at 0x227ea5e2cc0>

png

png

总结

本文中,我们首先介绍了窗函数的定义,说明了窗函数能够减少信号泄露,并且在信号分析非常的便利,然后我们又介绍了常见的几种窗函数和它们的性质


http://chatgpt.dhexx.cn/article/PlE7IfPN.shtml

相关文章

什么是窗函数?

本文转自https://zhuanlan.zhihu.com/p/24318554 主要内容包括&#xff1a; 1. 为什么要加窗函数&#xff1b; 2. 窗函数的定义&#xff1b; 3. 窗函数的时频域特征&#xff1b; 4. 加窗函数的原则&#xff1b; 5. 模态测试所用窗函数&#xff1b; 6. 窗函数带来的影响。…

窗函数总结

参考链接 文中第一、二节参考链接&#xff1a; 什么是泄漏&#xff1f; 文中第三节参考链接&#xff1a; 何时、何地应用何种的窗函数? 文中第四、五节参考链接&#xff1a; 窗函数概念知识点统计_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&#xff08;v2&#xff09; irq-gic-common.c drivers/of/irq.c

irqbalance机制分析

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

request_irq()

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

linux IRQ Management(六)- DTS及调试

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

Linux IRQ number和中断描述符

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

irqbalance

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

linux irq 接口,Linux内核API irq_set_irq_type

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

Linux Irq domain

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

linux IRQ Management(四)- IRQ Domain

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

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

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

Java 字段封装快捷键

快捷键:shift alt s 选择&#xff1a;

Java封装阿里云对象存储OSS

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

java 枚举 封装操作方法

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

Java封装和封装的案例

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

Java的封装方法

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

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

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

15、JAVA入门——封装

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

初学java封装

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