当前位置: 首页 > article >正文

时频分析法——连续小波变换(CWT)

连续小波变换是一种数学工具,用于将信号分解为构成其的小波或波形。这种变换在信号处理、图像分析、音频压缩等领域有广泛的应用。与傅里叶变换相比,连续小波变换能提供关于信号在不同时间和尺度上的详细信息,使之更适合分析非平稳信号(即信号的统计特性随时间变化的信号)。

 所使用的数据来自于公开的心电信号数据库,获取网址如下:PTB Diagnostic ECG Database v1.0.0 (physionet.org)

本文使用经过预处理的心电信号(ECGs)作为分析例子,所有图片均有它所得到:在我的资源中的"processed_ecg segment_csdn "

连续小波变换的定义

连续小波变换利用一组基函数(称为小波)对信号进行分析。这些小波是由一个母小波通过平移和缩放生成的。母小波 ψ(t) 是一个平均值为零的波形,通常具有快速衰减的特性。通过调整缩放因子 a 和平移参数 b 来生成不同的小波,从而能够聚焦于信号的不同特性。小波变换可以定义为:

CWT(a, b) = \frac{1}{\sqrt{\left | a \right |}}\int_{-\infty }^{+\infty }f(t)\varphi ^{*}(\frac{t-b}{a})dt

其中f(t) 是输入信号;ψ(t) 是母小波;a 是缩放参数(不等于零),控制小波的伸缩;b 是平移参数,控制小波在时间轴上的位置。

常用的母小波

Haar小波:可能是最简单的小波,适合处理具有突变点的信号;公式为:

\varphi (t) = \left\{\begin{matrix} 1 &t\in [0, \frac{1}{2}] \\ -1 &t\in[\frac{1}{2}, 1] \\ 0&other \end{matrix}\right.

Ricker小波:常用于边缘检测和图像处理中;公式为:

\psi (t) = \frac{2}{\sqrt{3}\sigma \pi ^{1/4}}(1-\frac{t^{2}}{\sigma ^{2}})e^{-t^{2}/2\sigma ^{2}}

这里的\sigma控制波形的宽度,通常取标准差的值。

Daubechies小波:一系列具有更平滑特性的小波,能更好地捕捉信号的详细信息,一般使用的是db4小波;公式为:

\psi (t) = \frac{1+\sqrt{3}}{4}(1+t)e^{-t/2}u(t)-\frac{1-\sqrt{3}}{4}(1-t)e^{-t/2}u(-t)

u(t)是信号与系统中的脉冲函数。

Morlet小波:结合了余弦波和高斯函数,适用于频率分析;表达式为:

\psi (t) = \pi ^{-1/4}e^{i\omega _{0}t}e^{-t^{2}/2}

其中,\omega _{0}是中心频率。

连续小波变换的实现

在本文使用Morlet小波作为母小波。首先我们来绘制原始V2导联信号图,绘制代码及图像如下:

import matplotlib.pyplot as plt
import json
import matplotlib

#字体样式和大小
matplotlib.rcParams['font.family'] = 'Times New Roman'
matplotlib.rcParams['font.size'] = 26

#加载ECG数据,请更换为自己的本地地址
with open(r"F:\ecg segment_cwt_csdn.json", "r") as file:
    ecg_data = json.load(file)
signal_data = ecg_data['data']
fs = ecg_data['fs']  #加载采样频率 hz=1000

# 获取V1导联的数据
signal = signal_data['V2']

# 创建图表并绘制V1导联
plt.figure(figsize=(15, 5))
plt.plot(signal)
plt.title('V2 Lead ECG Signal')
plt.xlabel('Time (samples)')
plt.ylabel('Amplitude')
plt.show()

连续小波变换代码实现

import numpy as np
import matplotlib.pyplot as plt
import json
import pywt
import matplotlib

#字体样式和大小
matplotlib.rcParams['font.family'] = 'Times New Roman'
matplotlib.rcParams['font.size'] = 26

# 加载ECG数据,更换为自己的本地储存地址
with open(r"F:\ecg segment_cwt_csdn.json", "r") as file:
    ecg_data = json.load(file)
signal_data = ecg_data['data']

#获取V2导联的数据
lead_data = signal_data['V2']

#定义连续小波变换
def extract_cwt_features(lead_data, scales):
    ##cmorB-C表示带宽为B,中心频率为C的莫雷特小波; sampling_period是信号的采样频率
    coefficients, frequencies = pywt.cwt(lead_data, scales, 'cmor1.5-1.0', sampling_period=1/1000)
    return coefficients

#设置小波尺度,这里设置的尺度参数是0-119
scales = np.arange(1, 120)

#计算时频特征
cwt_features = extract_cwt_features(lead_data, scales)

#绘制处理后的CWT结果
plt.figure(figsize=(12, 8))
plt.imshow(np.abs(cwt_features), aspect='auto', cmap='viridis')
plt.colorbar(label='Magnitude')
plt.title('Continuous Wavelet Transform (CWT) of V2 Lead ECG')
plt.xlabel('Time')
plt.ylabel('Scale')
plt.show()

运行上述代码得到的时频图:


http://www.kler.cn/a/320299.html

相关文章:

  • 4-7-1.C# 数据容器 - LinkedList(LinkedList 的定义、LinkedList 结点的遍历、LinkedList 的常用方法)
  • 天童美语:下元节将至
  • HarmonyOs鸿蒙开发实战(9)=>解析json数据,自动生成实体Bean插件-jsonFormat使用教程(铁粉福利)
  • ue中使用webui有效果白色拖动条 有白边
  • 【Docker】在 Ubuntu 上安装 Docker 的详细指南
  • 鸿蒙HarmonyOS 地图定位到当前位置 site查询等操作
  • ubuntu数据硬盘故障导致系统启动失败
  • 四元组问题
  • 医院伤员小程序点餐———未来之窗行业应用跨平台架构
  • C# 游戏引擎中的协程
  • Dubbo快速入门(一):分布式相关概念
  • python学习记录3
  • 专业学习|《随机过程》学习笔记(二)(定义、分类及相关过程)
  • 虚幻引擎第三人称和第一人称任意切换
  • 图论系列(dfs)9.25
  • Xk8s证书续期
  • 从文本图片到多模态:3D 数字人打开企业全域商业增长新空间
  • ROS1是DCS,ROS2是FCS
  • LangChain教程 - 基于SQL数据的问答系统教程
  • 吉林一号宽幅01星亚米级宽幅相机影像的无控定位精度
  • Linux——应用层协议HTTP
  • Altium Designer(AD)百度云下载与安装(附安装步骤)
  • VMware 如何上网
  • ubuntu 20.04修改启动项默认等待时间
  • UnLua实现继承
  • 便捷点餐:Spring Boot 点餐系统