52phm简介


专注于工业智能预警系统研发, 通过机理算法和数据驱动算法分析振动信号、音频、DCS、PLC信号、SCADA信号等设备运行状态数据对机器设备进行看病预诊,为机器设备健康运行保驾护航。 网站正在不断建设和完善过程中,欢迎大家给予建议和参与社区建设

联系我们


投稿说明


52phm,专注于预测性维护知识学习和交流,欢迎广大从事预测性维护行业人员投稿,投稿请联系管理员(wx: www52phmcn),投稿内容可以是:

  • 学习笔记
  • 技术理论
  • 工程案例
  • 行业资讯

加入我们


官方公众号:52phm,专注预测性维护的学习平台

2022-02-11 13:19:32    博客笔记    1005    当前专栏:振动信号预处理    分类:算法开发    本站官网:www.52phm.cn   

公众号 ...

python使用窗函数处理频谱泄露

  • date:2019.12.18
  • author:小知
  • 课题:窗函数使用 实现不同窗函数截取波形信号

背景

2019.12.18 & 小知同学

  1. 当运用计算机实现工程测试信号处理时,不可能对无限长的信号进行测量和运算,而是取其有限的时间片段进行分析。做法是从信号中截取一个时间片段,然后用观察的信号时间片段进行周期延拓处理,得到虚拟的无限长的信号,然后就可以对信号进行傅里叶变换、相关分析等数学处理。无线长的信号被截断以后,其频谱发生了畸变,原来集中在f(0)处的能量被分散到两个较宽的频带中去了(这种现象称之为频谱能量泄漏)。
  2. 为了减少频谱能量泄漏,可采用不同的截取函数对信号进行截断,截断函数称为窗函数,简称为窗。
  3. 信号截断以后产生的能量泄漏现象是必然的,因为窗函数w(t)是一个频带无限的函数,所以即使原信号x(t)是限带宽信号,而在截断以后也必然成为无限带宽的函数,即信号在频域的能量与分布被扩展了。又从采样定理可知,无论采样频率多高,只要信号一经截断,就不可避免地引起混叠,因此信号截断必然导致一些误差。泄漏与窗函数频谱的两侧旁瓣有关,如果两侧瓣的高度趋于零,而使能量相对集中在主瓣,就可以较为接近于真实的频谱,为此,在时间域中可采用不同的窗函数来截断信号。
  4. 概括来讲,主瓣是时域信号频率成分的中央,有较高的峰值,旁瓣接近于0,这代表频谱泄露少,为积极的一面;反之,如果旁瓣不接近0,也有大大小小的峰值,那么可以说明频谱泄露多,为不利的一面,需要另外采用合适的窗函数再进行处理。
  5. 选择加窗函数并非易事。 每一种加窗函数都有其特征和适用范围。 要选择加窗函数,必须先估计信号的频率成分。
  6. 总之,Hanning窗适用于95%的情况。 它不仅具有较好的频率分辨率,还可减少频谱泄露。 如果您不知道信号特征但是又想使用平滑窗,那么就选择Hanning窗。

原始波形数据

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
signal = [2.55, 2.36, 2.82, 2.31, 1.79, 1.91, 1.76, 0.99, 0.85, 1.51, 0.77, 0.25, 0.06, -0.14, -0.96, -1.43, -1.59, -1.74, -1.4, -1.54, -1.98, -2.02, -1.67, -2.29, -2.12, -1.6, -1.37, -1.37, -0.66, 0.29, 0.22, 0.67, 1.25, 1.1, 1.09, 1.63, 1.99, 1.61, 2.52, 2.98, 2.62, 2.33, 2.8, 2.5, 1.54, 1.92, 1.73, 1.09, 0.82, 1.35, 1.01, 0.29, 0.33, -0.45, -0.88, -1.07, -1.39, -1.86, -1.6, -1.4, -2.03, -1.95, -1.61, -1.97, -2.48, -1.93, -1.44, -1.56, -0.7, -0.19, 0.2, 0.46, 1.22, 1.3, 0.92, 1.81, 1.89, 1.68, 2.04, 2.97, 2.7, 2.43, 2.91, 2.39, 1.61, 1.66, 2.04, 1.12, 0.97, 1.5, 0.98, 0.16, 0.16, -0.04, -0.91, -1.02, -1.25, -1.7, -1.84, -1.43, -1.81, -1.94, -1.39, -2.14, -2.59, -2.22, -1.51, -1.39, -1.06, 0.01, 0.12, 0.49, 1.02, 1.19, 1.15, 1.4, 1.7, 1.65, 2.33, 2.81, 2.63, 2.48, 3.1, 2.68, 1.61]
time = range(len(signal))
# 原始波形
plt.plot(time, signal)
[<matplotlib.lines.Line2D at 0x7f8b89d87588>]

矩形窗处理

def rectangle(M=500):
    # 矩形窗
    windows = np.ones(M)
    return windows
rect = signal * rectangle(M=len(signal))
plt.plot(time, rect)
[<matplotlib.lines.Line2D at 0x7f8b89862828>]

三角形窗处理

def bartlett(M=500):
    # 三角形窗
    split_index = int(M / 2)
    win1 = [(2 * i) / M for i in range(split_index)]
    win2 = [(2 * (M - j)) / M for j in range(split_index, M)]
    windows = np.array(win1  win2)
    return windows
bart = signal * bartlett(M=len(signal))
plt.plot(time, bart)
[<matplotlib.lines.Line2D at 0x7f8b89854780>]

汉宁窗处理

# 在不明确该使用什么窗函数的时候,首选的窗函数就是汉宁窗,
# 因为汉宁窗 95% 的情况都适用,并且效果还比较理想。
def hanning(M=500):
    # 汉宁窗
    windows = np.array([0.5 - 0.5 * np.cos(2 * np.pi * i / (M-1)) for i in range(M)])
    return windows
hn = signal * hanning(M=len(signal))
plt.plot(time, hn)
[<matplotlib.lines.Line2D at 0x7f8b897b8ef0>]

海明窗处理

def hamming(M=500):
    # 海明窗
    windows = np.array([0.54 - 0.46 * np.cos(2 * np.pi * i / (M-1)) for i in range(M)])
    return windows
hm = signal * hamming(M=len(signal))
plt.plot(time, hm)
[<matplotlib.lines.Line2D at 0x7f8b89726860>]

指数窗处理

def index(M=500):
    # 指数窗,e = 2.7183
    windows = np.array([2.7183 ** (- abs(i - 1 - (M / 2)) / M) for i in range(M)])
    return windows
idx = signal * index(M=len(signal))
plt.plot(time, idx)
[<matplotlib.lines.Line2D at 0x7f8b89715278>]

高斯窗处理

def gaussian(M=500):
    # 高斯窗
    windows = np.array([2.7183 ** (-0.5 * ((3 * (2 * i / (M - 1))) ** 2)) for i in range(M)])
    return windows
gs = signal * gaussian(M=len(signal))
plt.plot(time, gs)
[<matplotlib.lines.Line2D at 0x7f8b89676c50>]

参考资料 [1]参考资料1:https://blog.csdn.net/demo_deng/article/details/17074415 [2]参考资料2:http://www.elecfans.com/emb/fpga/20171116580796_3.html

免责声明


[推荐] 基于Python的频谱泄露分析

2021-12-14 14:06:09    互联网    820    分类:算法开发    专栏:数字信号处理   


[推荐] python数据类型

2022-01-19 13:19:38    博客笔记    914    分类:算法开发    专栏:python基础   


[推荐] 齿轮故障诊断的实验数据集及python处理

2022-08-09 16:05:36    博客笔记    710    分类:边缘感知    专栏:齿轮箱数据集   



转发此文章到社区


关注公众号进群

让志同道合读者学习交流



python机器学习与特征工程理论与代码实现

通过python编程语言实现特征工程功能,本篇特征工程文章较为全面的介绍数据预处理,缺失值处理方法、异常值处理方法、数据无量纲、标准化、归一化,另外还介绍特征选择、特征降维等特征工程知识

2021-12-04 12:12:30    博客笔记    4641    分类:算法开发    专栏:特征工程   


基于python的快速傅里叶变换FFT

基于python的快速傅里叶变换FFT(二)本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换。知识点  FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量...

2021-12-14 14:06:34    互联网    886    分类:算法开发    专栏:数字信号处理   


python简介和下载安装

1、python介绍Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言, 随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。

2022-01-16 11:22:32    博客笔记    1050    分类:算法开发    专栏:python基础   


python编码和声明

python编码和声明 1、window环境下,在完成hello world运行后,已经初步掌握了python运行的机制,下面将介绍python编码方式。一般在pycharm编辑器中新建.py文件后,可以看到首行出现一行注释,例如

2022-01-17 23:15:26    博客笔记    841    分类:算法开发    专栏:python基础   


python输入input输出print函数

python输入input输出print函数python输入输出语句分别对应着input()和print()函数,下面分别对这两个函数进行介绍和实操。1、输入语句input()新建一个tmp.py文件当我们输入字符串时,返回数据类型是字符串# -*- coding: utf-8 -*-name = input("请输入您的名字:")print(name, type(name))运行tmp.py后,会提示手动输入信息,回车后就可以得到输出结果:请输入您的名字:小知小知 &lt;c

2022-01-17 23:25:01    博客笔记    863    分类:算法开发    专栏:python基础   


python变量名命名规则

python变量名命名规则变量名是指在代码中自定义的变量参数,比如a,b,_h, h1等,都可以称为变量名。下面介绍变量名的命名规范:变量名第一个字符必须是字母表中字母或下划线 _ ;变量名可以由字母、数字和下划线组成;变量名对大小写敏感,即大小写变量名含义不同;变量名不能与python内置关键字(比如def、if、else等)相同。1、变量名命名错误例子def = "晓物智联" # def 是python关键字,不能被当成变量名5ab = "晓物智联" # 变量名第一个字符不能为数

2022-01-17 23:36:20    博客笔记    800    分类:算法开发    专栏:python基础   


python内置关键字

python内置关键字python内置关键字是指变量、常量、函数、属性、类、模块标识符,比如def表示函数标识符,if表示条件语句标识符等。下面列出python常见的关键字:1、获取关键字import keywordprint(keyword.kwlist)""" 输出['False', 'None', 'True', 'and', 'as','assert','break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except

2022-01-17 23:48:03    博客笔记    795    分类:算法开发    专栏:python基础   


python代码注释方式

python代码注释方式代码注释从大的方面来说,主要分为单行注释和多行注释。1、单行注释使用#进行注释,如# 这是单行注释样例# 初始化一个变量 namename = "52phm"name = "52phm" # 初始化一个变量 name2、多行注释使用单引号注释name = '''52phm,工业互联网人的技术交流社区,网站地址:http://www.52phm.cn'''使用双引号注释name = """52phm,工业互联网人的技术交流社区,网站地址:http

2022-01-17 23:54:38    博客笔记    854    分类:算法开发    专栏:python基础   


python模块import导入

python模块import导入模块导入分为python内置模块(或者第三方模块)导入和自定义模块导入。模块导入方法可以总结为5大导入方法,下面以python内置模块角度来举例介绍5大导入方法。(1)import… 方法表示导入某个模块# 导入numpy模块import numpyarr = numpy.array([1, 2, 4])print(arr)# [1 2 4](2)import…as…方法import xx as yy,意思是把xx作为yy表示,相当于xx可以使用yy来

2022-01-17 23:59:41    博客笔记    1279    分类:算法开发    专栏:python基础   


python 编码规范PEP8

python 编码规范主要有以下5个方面: 代码布局——导入——表达式和语句中的空格——注释——命名约定 1.代码布局:上下左右总体的布局 (1)缩进:4个空格一个缩进层次,通常在if语句、for语句和while语句等等后面,一个【Tab】键等于4个空格。 (2)行的最大长度:一般每行不超过80字符。 (3)空行:用两行空行分割顶层函数和类的定义;类内方法的定义用单个空行分割;当空行用于分割方法(method)的定义时,在'class'行和第一个方法定义之间也要有一个空行.

2022-03-26 12:16:15    博客笔记    1087    分类:开发环境    专栏:编码规范   


  • 52phm公告

  • 在这里,可以学习接触到工业互联网技术知识以及落地案例,其中涵盖工业数据集、工业标准库、机理模型、设备知识、机器学习、 深度学习、特征工程、振动分析、工业视觉、边缘硬件及传感器等技术知识!


振动信号预处理   
  • 关于站长


  •         从事设备故障预测与健康管理行业多年的PHM算法工程师(机器医生)、国际振动分析师, 实践、研发和交付的项目涉及“化工、工业机器人、风电机组、钢铁、核电、机床、机器视觉”等领域。专注于工业智能预警系统研发, 通过机理算法和数据驱动算法分析振动信号、音频、DCS、PLC信号、SCADA信号等设备运行状态数据对机器设备进行看病预诊,为机器设备健康运行保驾护航。


当前文章目录


52phm社区

52phm社区,专注预测性维护的学习平台!

Saas体验

+ 工业demo学习系统

技术博客

+ 博客首页    + 算法开发    + 边缘感知   

+ 设备机理    + 开发环境

+ 论文速递   

友情链接

+ 在码圈

联系我

Copyright© 2021 52phm社区

京ICP备2021029973号-1