0


时频分析法——连续小波变换(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导联信号图,绘制代码及图像如下:

  1. import matplotlib.pyplot as plt
  2. import json
  3. import matplotlib
  4. #字体样式和大小
  5. matplotlib.rcParams['font.family'] = 'Times New Roman'
  6. matplotlib.rcParams['font.size'] = 26
  7. #加载ECG数据,请更换为自己的本地地址
  8. with open(r"F:\ecg segment_cwt_csdn.json", "r") as file:
  9. ecg_data = json.load(file)
  10. signal_data = ecg_data['data']
  11. fs = ecg_data['fs'] #加载采样频率 hz=1000
  12. # 获取V1导联的数据
  13. signal = signal_data['V2']
  14. # 创建图表并绘制V1导联
  15. plt.figure(figsize=(15, 5))
  16. plt.plot(signal)
  17. plt.title('V2 Lead ECG Signal')
  18. plt.xlabel('Time (samples)')
  19. plt.ylabel('Amplitude')
  20. plt.show()

连续小波变换代码实现

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import json
  4. import pywt
  5. import matplotlib
  6. #字体样式和大小
  7. matplotlib.rcParams['font.family'] = 'Times New Roman'
  8. matplotlib.rcParams['font.size'] = 26
  9. # 加载ECG数据,更换为自己的本地储存地址
  10. with open(r"F:\ecg segment_cwt_csdn.json", "r") as file:
  11. ecg_data = json.load(file)
  12. signal_data = ecg_data['data']
  13. #获取V2导联的数据
  14. lead_data = signal_data['V2']
  15. #定义连续小波变换
  16. def extract_cwt_features(lead_data, scales):
  17. ##cmorB-C表示带宽为B,中心频率为C的莫雷特小波; sampling_period是信号的采样频率
  18. coefficients, frequencies = pywt.cwt(lead_data, scales, 'cmor1.5-1.0', sampling_period=1/1000)
  19. return coefficients
  20. #设置小波尺度,这里设置的尺度参数是0-119
  21. scales = np.arange(1, 120)
  22. #计算时频特征
  23. cwt_features = extract_cwt_features(lead_data, scales)
  24. #绘制处理后的CWT结果
  25. plt.figure(figsize=(12, 8))
  26. plt.imshow(np.abs(cwt_features), aspect='auto', cmap='viridis')
  27. plt.colorbar(label='Magnitude')
  28. plt.title('Continuous Wavelet Transform (CWT) of V2 Lead ECG')
  29. plt.xlabel('Time')
  30. plt.ylabel('Scale')
  31. plt.show()

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


本文转载自: https://blog.csdn.net/m0_71995775/article/details/140890109
版权归原作者 懒大王12138 所有, 如有侵权,请联系我们删除。

“时频分析法——连续小波变换(CWT)”的评论:

还没有评论