您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:用Python的绘图库(matplotlib)绘制小波能量谱

51自学网 2021-10-30 22:44:28
  python
这篇教程用Python的绘图库(matplotlib)绘制小波能量谱写得很实用,希望能帮到您。

时间小波能量谱

  • 反映信号的小波能量沿时间轴的分布。

由于小波变换具有等距效应,所以有:

在这里插入图片描述

式中

在这里插入图片描述

表示信号强度,对于式在平移因子b方向上进行加权积分

在这里插入图片描述

式中

在这里插入图片描述

代表时间-小能量谱

尺度小波能量谱

  • 反映信号的小波能量随尺度的变化情况。

同理,对式在尺度方向上进行加权积分:

在这里插入图片描述

式中

在这里插入图片描述

连续小波变换

  • 连续小波变换的结果是一个小波系数矩阵,随着尺度因子和位移因子变化。然后将系数平方后得到小波能量,把每个尺度因子对应的所有小波能量进行叠加,那么就可以得到随尺度因子变换的小波能量谱曲线。把尺度换算成频率后,这条曲线就可视为是频谱图。

代码如下:

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport pywtfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib.ticker import MultipleLocator, FormatStrFormatter# 解决负号显示问题plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题plt.rcParams.update({'text.usetex': False, 'font.family': 'serif', 'font.serif': 'cmr10', 'mathtext.fontset': 'cm'})font1 = {'family': 'SimHei', 'weight': 'normal', 'size': 12}font2 = {'family': 'Times New Roman', 'weight': 'normal', 'size': 18}label = {'family': 'SimHei', 'weight': 'normal', 'size': 15}xlsx_path = "../小波能量谱作图.xlsx"sheet_name = "表名"      data_arr = pd.read_excel(xlsx_path, sheet_name=sheet_name)column_name = '列名'     row = 1024y = data_arr[column_name][0:row]x = data_arr['time'][0:row]scale = np.arange(1, 50)wavelet = 'gaus1'   # 'morl'  'gaus1'  小波基函数# 时间-尺度小波能量谱def time_scale_spectrum():    coefs, freqs = pywt.cwt(y, scale, wavelet)  # np.arange(1, 31) 第一个参数必须 >=1     'morl'  'gaus1'    scale_freqs = np.power(freqs, -1)  # 对频率freqs 取倒数变为尺度    fig = plt.figure(figsize=(5, 4))    ax = Axes3D(fig)    # X:time   Y:Scale   Z:Amplitude    X = np.arange(0, row, 1)  # [0-1023]    Y = scale_freqs    X, Y = np.meshgrid(X, Y)    Z = abs(coefs)    # 绘制三维曲面图    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')    # 设置三个坐标轴信息    ax.set_xlabel('$Mileage/km$', color='b', fontsize=12)    ax.set_ylabel('$Scale$', color='g', fontsize=12)    ax.set_zlabel('$Amplitude/mm$', color='r', fontsize=12)    plt.draw()    plt.show()# 时间小波能量谱def time_spectrum():    coefs, freqs = pywt.cwt(y, scale, wavelet)    coefs_pow = np.power(coefs, 2)      # 对二维数组中的数平方    spectrum_value = [0] * row    # len(freqs)    # 将二维数组按照里程叠加每个里程上的所有scale值    for i in range(row):        sum = 0        for j in range(len(freqs)):            sum += coefs_pow[j][i]        spectrum_value[i] = sum    fig = plt.figure(figsize=(7, 2))    line_width = 1    line_color = 'dodgerblue'    line_style = '-'    T1 = fig.add_subplot(1, 1, 1)    T1.plot(x, spectrum_value, label='模拟', linewidth=line_width, color=line_color, linestyle=line_style)    # T1.legend(loc='upper right', prop=font1, frameon=True)  # lower ,left    # 坐标轴名称    T1.set_xlabel('$time$', fontsize=15, fontdict=font1)  # fontdict设置子图字体    T1.set_ylabel('$E/mm^2$', fontsize=15, fontdict=font1)    # 坐标刻度值字体大小    T1.tick_params(labelsize=15)    print(spectrum_value[269])    plt.show()# 尺度小波能量谱def scale_spectrum():    coefs, freqs = pywt.cwt(y, scale, wavelet)    coefs_pow = np.power(coefs, 2)      # 对二维数组中的数平方    scale_freqs = np.power(freqs, -1)   # 对频率freqs 取倒数变为尺度    spectrum_value = [0] * len(freqs)    # len(freqs)    # 将二维数组按照里程叠加每个里程上的所有scale值    for i in range(len(freqs)):        sum = 0        for j in range(row):            sum += coefs_pow[i][j]        spectrum_value[i] = sum    fig = plt.figure(figsize=(7, 4))    line_width = 1    line_color1 = 'dodgerblue'    line_style1 = '-'    T1 = fig.add_subplot(1, 1, 1)    T1.plot(scale_freqs, spectrum_value, label=column_name, linewidth=line_width, color=line_color1, linestyle=line_style1)    # T1.legend(loc='upper right', prop=font1, frameon=True)  # lower ,left    # 坐标轴名称    T1.set_xlabel('$Scale$', fontsize=15, fontdict=font1)  # fontdict设置子图字体    T1.set_ylabel('$E/mm^2$', fontsize=15, fontdict=font1)    # 坐标刻度值字体大小    T1.tick_params(labelsize=15)    plt.show()# 通过调用下面三个不同的函数选择绘制能量谱time_scale_spectrum()# time_spectrum()# scale_spectrum()

最终绘制的能量谱图如下:

1.时间-尺度小波能量谱

2.时间小波能量谱

3.尺度小波能量谱

到此这篇关于用Python的绘图库(matplotlib)绘制小波能量谱的文章就介绍到这了,希望对你有帮助,更多相关用Python绘制内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章,希望大家以后多多支持51zixue.net!


用基于python的appium爬取b站直播消费记录
Python Numpy之linspace用法说明
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。