希尔伯特黄变换(hht)

提示:主要对希尔伯特黄变换进行简略的介绍


一、希尔伯特黄变换是什么?

1.1 定义

为了纪念故事中两位老先生(Hilbert和Huang)的突出贡献,人们决定把“经过EMD分解出的IMF分量再经过Hilbert变换,最终得到信号瞬时频率和瞬时幅值”的方法叫做希尔伯特黄变换
来源链接

1.2 公式

a(t):瞬时幅值
在这里插入图片描述
图片链接

二、代码

2.1.代码

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from pyhht import EMD
from scipy.signal import hilbert
import tftb.processingmatplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
matplotlib.rcParams['axes.unicode_minus'] = False  # 显示负号def picture(x, y, N):'''画信号的时域图和频谱输入:x: 0-1时间序列y: 信号N: 1s内采样点数输出:信号的时域图和频谱'''ax1 = plt.subplot(2, 1, 1)plt.plot(x, y)plt.xlabel('时间/s')plt.ylabel('幅值')plt.title('合成信号时域曲线')yf = np.fft.fft(y)xf = np.linspace(0.0, N / 2, N // 2)ax2 = plt.subplot(2, 1, 2)plt.plot(xf, 2.0 / N * np.abs(yf[:N // 2]))  # 频谱幅值归一化,需要*2/Nplt.xlabel('频率/Hz')plt.ylabel('幅值')plt.title('合成信号频谱')plt.show()def HHTAnalysis(t, signal, N):'''进行HHT分析,画出每一个IMF的时域图和频谱输入:t: 0-1时间序列signal: 信号N: 1s内采样点数输出:信号每一个IMF的时域图和频谱且返回IMFs,维度为(IMFs个数,信号点数N)'''# 进行EMD分解decomposer = EMD(signal)# 获取EMD分解后的IMF成分imfs = decomposer.decompose()# 分解后的IMF个数n_components = imfs.shape[0]# 画出每一个IMF的时域图和频谱fig1, axes = plt.subplots(n_components, 2, figsize=(10, 7), sharex='col', sharey=False)for i in range(n_components):# 画时域图axes[i][0].plot(t, imfs[i])axes[i][0].set_title('IMF{}'.format(i + 1))# 画fft图yf = np.fft.fft(imfs[i])xf = np.linspace(0.0, N / 2, N // 2)axes[i][1].plot(xf, 2.0 / N * np.abs(yf[:N // 2]))  # 频谱幅值归一化,需要*2/Naxes[i][1].set_title('IMF{}'.format(i + 1))plt.show()return imfsdef HHTPicture(t, imfs, N, n):'''画出指定个数的IMFs的时域图和时频图输入:t: 0-1时间序列imfs: IMFs成分N: 1s内采样点数n: 指定画前几个IMFs成分输出:前n个IMFs的时域图和时频图'''fig2, axes = plt.subplots(n, 2, figsize=(10, 7), sharex='col', sharey=False)# 计算并绘制各个组分for iter in range(n):# 绘制分解后的IMF时域图axes[iter][0].plot(t, imfs[iter])axes[iter][0].set_xlabel('时间/s')axes[iter][0].set_ylabel('幅值')# 计算各组分的Hilbert变换imfsHT = hilbert(imfs[iter])# 计算各组分Hilbert变换后的瞬时频率# 使用梯形积分法计算解析信号在特定时间瞬时的瞬时频率。instf, timestamps = tftb.processing.inst_freq(imfsHT)# 绘制瞬时频率,这里乘以fs是正则化频率到真实频率的转换# plt.figure(figsize=(10, 7))# plt.plot(timestamps, instf)# # 绘制标题# plt.title('hilbert')fs = Naxes[iter][1].plot(timestamps / fs, instf * fs)axes[iter][1].set_xlabel('时间/s')axes[iter][1].set_ylabel('频率/Hz')# 计算瞬时频率的均值和中位数axes[iter][1].set_title('Freq_Mean{:.2f}----Freq_Median{:.2f}'.format(np.mean(instf * fs), np.median(instf * fs)))def HHTFilter(signal, componentsRetain):'''定义HHT的滤波函数,提取部分EMD组分输入:signol: 信号componentsRetain: IMF的列表 []输出:一幅图,同时包含原始信号和合成信号'''# 进行EMD分解decomposer = EMD(signal)# 获取EMD分解后的IMF成分imfs = decomposer.decompose()# 选取需要保留的EMD组分,并且将其合成信号signalRetain = np.sum(imfs[componentsRetain], axis=0)# 绘图plt.figure(figsize=(10, 7))# 绘制原始数据plt.plot(signal, label='RawData')# 绘制保留组分合成的数据plt.plot(signalRetain, label='HHTData')# 绘制标题plt.title('RawData-----HHTData')# 绘制图例plt.legend()plt.show()return signalRetain# 生成0-1时间序列,共2048个点
N = 2000
t = np.linspace(0, 1, N)
# 生成信号
# signal = (2 + np.cos(8 * np.pi * t)) * np.cos(40 * np.pi * (t + 1) ** 2) + np.cos(
#     20 * np.pi * t + 5 * np.sin(200 * np.pi * t))
signal = 0.8 * np.cos(20 * np.pi * t*2) + 0.5 * np.cos(40 * np.pi * (t + 1) * 2) + 0.2*np.cos(200 * np.pi * t*2) + 0.1 * np.cos(400 * np.pi * t*2)
# 画出原始信号的时域图和频谱
picture(t, signal, N)
# 进行HHT分析,画出所有IMFs的时域图和频谱
imfs = HHTAnalysis(t, signal, N)
# 画出前2个IMFs的时域图和时频图
HHTPicture(t, imfs, N, 4)
# 为了纪念故事中两位老先生(Hilbert和Huang)的突出贡献,人们决定把“经过EMD分解出的IMF分量再经过Hilbert变换,最终得到信号瞬时频率和瞬时幅值”的方法叫做希尔伯特黄变换
# 进行验证,判断与原始信号的差异
signalRetain = HHTFilter(signal, [0, 1])

2.2 结果分析

2.2.1 第一张图

上图:合成的原始信号(频率分别为20Hz,40Hz,200Hz,400Hz的正弦波)。
下图:合成的原始图像的频谱,频率成分明显。
在这里插入图片描述

2.2.2 第二张图

对原始振动信号进行EMD分解,只显示前4个IMF分量。
左侧是EMD分解后得到的原始图像,左侧是对右侧图像分别进行FFT(快速傅里叶变换)后的图像。(IMF1主要频率成分400Hz,IMF2主要频率成分200Hz,IMF3主要频率成分40Hz,IMF3主要频率成分20Hz)
在这里插入图片描述

2.2.3 第三张图

左侧是EMD分解后得到的原始图像,左侧是对右侧图像分别先进行Hilbert变换,再进行瞬时频率计算得到的结果。
左侧可以显示不同IMF分量在不同时刻的频率成分。
在这里插入图片描述

总结

希尔伯特黄变换是一种时频分析手段,对于分稳态信号的分析较有效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/278092.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扫地机器人测试点

简介:在科技发展的浪潮下,扫地机器人已经成为越来越多家庭的“贴心管家”,助力我们迎战尘埃和杂物。但是,面对市面上五花八门的扫地机器人,以下为一般情况下扫地机器人的功能测试要点。 历史攻略: AI语音…

Vue3-19-组件-定义和基本使用

组件的定义 个人理解 :1、组件,就是我们把某个功能模块进行封装,在使用时直接引入进行使用,极大的提高了代码的可复用性。2、在vue 中,一个 [.vue] 文件,就是一个组件。3、组件之间存在【引入】 与 【被引…

Golang在 Docker 中交叉编译 Windows

前言: 前端时间把本地的 Golang 开发环境卸载了,如果编写代码的话就是启动一个 Golang 的 Docker 容器。这样做对于服务端开发本来也是没有问题的,但是有时候想要把程序放到 Windows 上面来执行,那就遇到麻烦了。因为 Docker 容器…

MSP430x44x Terminal Functions使用说明

DVcc1 1 I/O ADC中参考电压正极端子的输出 P6.3/A3 2 I/O 通用数字I/O/模拟输入a3--12位ADC P6.4/A4 3 I/O 通用数字I/O/模拟输入a4--12位ADC P6.5/A5 4 I/O 通用数字I/O/模拟输入a5--12位ADC P6.6/A6 5 I/O 通用数字I/O/模拟输入a6--12位ADC P6.7/A7/SVSI…

文件上传自动化测试方案(超详细)

一、概述 【测试地址】:https://pan.baidu.com 【测试工具】:selenium、requests 【脚本语言】:Python 【运行环境】:Windows 百度网盘作为文件存储及分享的平台,核心功能大部分是对文件的操作,如果要…

小红书可观测 Metrics 架构演进,如何实现数十倍性能提升?

在当前云原生时代,随着微服务架构的广泛应用,云原生可观测性概念被广泛讨论。可观测技术建设,将有助于跟踪、了解和诊断生产环境问题,辅助开发和运维人员快速发现、定位和解决问题,支撑风险追溯、经验沉淀、故障预警&a…

广西开放大学形成性考核 平时作业 统一资料 参考

试卷代号:1293 心理学 参考试题 一、选择题(每个3分,共30分,含单选和多选,请将正确答案的字母序号填入括号中) 1.人们通常把下列图形知觉为一个连续、完整的形状,说明图形知觉遵循( )。…

如何发布自定义 npm 组件包

准备工作 1. 注册 npm 账号 还没有 npm 账号?去官网注册: https://www.npmjs.com 需要记住用户名、密码、邮箱,后面需要用到。 2. 查看本地 npm 镜像,如果不是默认的,需要改回来 npm config get registry重置镜像路…

统一观测丨使用 Prometheus 监控 Memcached 最佳实践

作者:啃唯 Memcached 简介 Memcached 是什么? Memcached 是一个免费开源、高性能、分布式内存对象缓存系统,支持将任意数据类型的 chunk 数据以键值对的方式存储。本质上 Memcached 是通用于所有的应用的,但最初用于存储被经常…

PyQt6 QFrame分割线控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

Nginx(四层+七层代理)+Tomcat实现负载均衡、动静分离

一、Tomcat多实例部署 具体步骤请看我之前的博客 写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/134956765?spm1001.2014.3001.9457 1.1 访问测试多实例的部署 1.2 分别在三个tomcat服务上部署jsp的动态页面 mkdir /usr/local/tomcat/webapps/test vim …

Tomcat部署与调优

目录 前瞻 什么是tomcat? 什么是servlet? 什么是JSP? Tomcat功能组件结构 Container结构分析 Tomcat请求过程 Tomcat服务部署 1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下 2.安装JDK 3.设置JDK环境变量 4.安装启动Tomc…