Python如何绘制小波能量谱,操作是什么
Admin 2022-07-15 群英技术资讯 357 次浏览
由于小波变换具有等距效应,所以有:
式中
表示信号强度,对于式①
在平移因子b方向上进行加权积分
式中
代表时间-小能量谱
同理,对式①
在尺度方向上进行加权积分:
式中
代码如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import pywt from mpl_toolkits.mplot3d import Axes3D from 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 = 1024 y = 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.尺度小波能量谱
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了利用Python读取CSV文件并计算某一列的均值和方差,这里利用了csv模块来对文件进行处理,文章通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
这篇文章主要介绍了用Python提取PDF表格的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
Python 3版本中的异常处理与Python 2版本主要有以下4点不同:
这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章主要为大家介绍了python标准库ElementTree处理xml的方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008