文章目录

  • 什么是窗函数?
  • 窗函数的作用是什么?
    • 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 inline

M = 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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

窗函数的作用是什么?

1.防止泄露

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

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

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

import numpy as np
from scipy.signal import get_window
from scipy.fftpack import fft

import matplotlib.pyplot as plt

%matplotlib inline

M = 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(‘©Amplitude of unwindowed signal’)
plt.subplot(324)
plt.plot(mXW);plt.title(’(d)Amplitude of windowed signal’)

plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2. 分析意义

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

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

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

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

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

Rectangular

KaTeX parse error: Expected '}', got 'EOF' at end of input: …ere}\end{cases}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 plt

window = 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]”)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Hanning

w[n]=0.5+0.5∗cos(2πn/M)w[n]=0.5+0.5∗cos⁡(2πn/M)w[n]=0.5+0.5∗cos⁡(2πn/M)w[n]=0.5+0.5∗cos(2πn/M)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.5∗cos(2πn/M)w[n]=0.5+0.5∗cos⁡(2πn/M)w[n]=0.5+0.5∗cos(2πn/M)W[k]=0.5D[k]+0.25(D[k−1]+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]”)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Hamming

w[n]=0.54+46∗cos(2πn/M)w[n]=0.54+46∗cos⁡(2πn/M)w[n]=0.54+46∗cos⁡(2πn/M)w[n]=0.54+46∗cos(2πn/M)w[n]=0.54+46∗cos⁡(2πn/M) w[n] = 0.54+46*\cos (2\pi n/M)w[n]=0.54+46∗cos(2πn/M)w[n]=0.54+46∗cos⁡(2πn/M)w[n]=0.54+46∗cos(2πn/M)w[n]=0.54+46∗cos(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]”)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Blackman

w[n]=0.42−0.5cos(2πn/M)+0.08cos(4πn/M)w[n]=0.42−0.5cos⁡(2πn/M)+0.08cos⁡(4πn/M)w[n]=0.42−0.5cos⁡(2πn/M)+0.08cos⁡(4πn/M)w[n]=0.42−0.5cos(2πn/M)+0.08cos(4πn/M)w[n]=0.42−0.5cos⁡(2πn/M)+0.08cos⁡(4πn/M) w[n] = 0.42 - 0.5\cos(2\pi n/M) + 0.08\cos(4\pi n/M)w[n]=0.42−0.5cos(2πn/M)+0.08cos(4πn/M)w[n]=0.42−0.5cos⁡(2πn/M)+0.08cos⁡(4πn/M)w[n]=0.42−0.5cos(2πn/M)+0.08cos(4πn/M)w[n]=0.42−0.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]”)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Blackman-Harris

w[n]=1M∑3i=0αicos(2n/π/M),α0=0.35875,α1=0.35875,α1=0.35875,α3=0.35875w[n]=1M∑i=03αicos⁡(2n/π/M),α0=0.35875,α1=0.35875,α1=0.35875,α3=0.35875w[n]=1M∑i=03αicos⁡(2n/π/M),α0=0.35875,α1=0.35875,α1=0.35875,α3=0.35875w[n]=1M∑3i=0αicos(2n/π/M),α0=0.35875,α1=0.35875,α1=0.35875,α3=0.35875w[n]=1M∑i=03αicos⁡(2n/π/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.35875w[n]=1M∑3i=0αicos(2n/π/M),α0=0.35875,α1=0.35875,α1=0.35875,α3=0.35875w[n]=1M∑i=03αicos⁡(2n/π/M),α0=0.35875,α1=0.35875,α1=0.35875,α3=0.35875w[n]=M1​i=0∑3​αi​cos(2n/π/M),α0​=0.35875,α1​=0.35875,α1​=0.35875,α3​=0.35875w[n]=M1​i=0∑3​αi​cos(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]”)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
<matplotlib.text.Text at 0x227ea5e2cc0>
  • 1

总结

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

                                </div>

窗函数的作用以及各种窗函数相关推荐

  1. c语言窗函数的作用,窗函数的C语言实现

    /*窗类型*/ typedef enum { Bartlett = 0, BartLettHann, BlackMan, BlackManHarris, Bohman, Chebyshev, Flat ...

  2. Matlab2019b关于窗函数的详细设置(dsp.window)

    使用窗函数来截取一段无限长(非常长:远大于一帧的长度)的信号,形象的来描述就是透过一个窗户来看一个信号,这个窗户的形状会对信号有一定的影响. 看大佬的解释看不懂,水平不足,下面是从自身使用的感觉来讲的 ...

  3. 虹科教您 | 实时频谱分析仪中如何选择合适的FFT窗函数

    摘要 本文主要介绍了常见的窗函数以及窗函数有什么用,以及在实时频谱分析中,该如何选择合适的加窗方式. 随着无线通信的逐步发展,带来的是频谱环境的越发复杂与丰富,高度的信号变化性使得短时间内信号不再是一 ...

  4. c语言 汉宁窗,常用窗函数的特点

    1.矩形窗 矩形窗相当使信号突然截断所乘的窗函数,它的旁瓣较大,且衰减较慢,旁瓣的死一个负峰值为主瓣的21%,第一个正峰值为主瓣的12.6%,第二个负负峰值为主瓣的9%,故巨星唱效果不适很好,泄漏较大 ...

  5. matlab窗函数带通滤波器,Matlab结合窗函数法设计数字带通FIR滤波器

    Matlab结合窗函数法设计数字带通FIR滤波器 课程设计任务书学生姓名: 专业班级: 通信工程 指导教师: 工作单位: 信息工程学院 题 目:利用 Matlab 仿真软件系统结合窗函数法设计一个数字 ...

  6. 窗函数性能分析——MATLAB

    一.实验目的 1.掌握Matlah由各种窗数序列的生成方法; 2.掌握窗函数序列频率特性的计算与画图方法; 3.掌握窗函数的相关参数对窗函数频域性能的影响; 4.了解混合窗函数的定义.生成方法和频域性 ...

  7. mysql分窗函数_频谱分析中如何选择合适的窗函数

    加窗是为了减小泄漏! 1.信号截断及能量泄漏效应 数字信号处理的主要数学工具是傅里叶变换.应注意到,傅里叶变换是研究整个时间域和频率域的关系.然而,当运用计算机实现工程测试信号处理时,不可能对无限长的 ...

  8. 窗函数概念知识点统计

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

  9. 几种常见窗函数的特性

    几种常见窗函数的特性 解决一下上一篇的遗留问题 上一篇谈了FIR滤波器的加窗是什么,但是自觉得还是有些地方没有说明白,就好比模拟加窗过程都没有讲明白. 不过今天再看书时,又有所得,忽然明白了为什么模拟 ...

最新文章

  1. WPF - 资源收集
  2. Python实现字符串反转的6种方法
  3. 讲故事的用户故事样例之1
  4. hihocoder#1041 : 国庆出游(DFS)
  5. 德 梅齐里亚克的砝码问题matlab,德梅齐里亚克砝码问题之解
  6. 再见!阿里云首席科学家闵万里离职:创办风投基金
  7. New to Machine Learning? Avoid these three mistakes
  8. 发现《后端架构师技术图谱》
  9. vue 项目路由配置
  10. cannot set options after executing query
  11. tooth的用法_tooth的复数形式
  12. YOLOv3 ubuntu 配置及训练自己的VOC格式数据集
  13. c#直接横向打印LocalReport
  14. 占卜源码|塔罗牌占卜源码php开发搭建
  15. java spring源码_剑指Java自研框架,决胜Spring源码
  16. #遗憾#重重的挫败感再次袭来!!!
  17. Spring个人学习笔记
  18. php 赠送礼品功能开发,类似礼物说送礼提醒的功能该怎么做?
  19. getDerivedStateFromProps的用法
  20. Mac音效增强软件:Boom 3D

热门文章

  1. 页面的跳转——请求重定向和请求转发
  2. windows-sys19:vmware安装win11系统详细教程
  3. 找出7个默森尼数。法国数学家默森尼曾提出下列公式:Mp=2^p-1。
  4. 友盟一键登录获取手机号码PHP后端
  5. 哇哦,视频加字幕竟如此简单!!
  6. 30天自制操作系统第五天
  7. 小学信息技术计算机网络教案,小学信息技术教案范例
  8. Vue前端报错Uncaught (in promise) Error: Navigation cancelled from “/...“ to “/...“ with a new navigation
  9. 谈谈未来科技发展趋势—读KK《必然》
  10. Java选择题简单的考试系统