用Python的绘图库(matplotlib)绘制小波能量谱


Posted in Python onApril 17, 2021

时间小波能量谱

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

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

用Python的绘图库(matplotlib)绘制小波能量谱

式中

用Python的绘图库(matplotlib)绘制小波能量谱

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

用Python的绘图库(matplotlib)绘制小波能量谱

式中

用Python的绘图库(matplotlib)绘制小波能量谱

代表时间-小能量谱

尺度小波能量谱

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

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

用Python的绘图库(matplotlib)绘制小波能量谱

式中

用Python的绘图库(matplotlib)绘制小波能量谱

连续小波变换

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

代码如下:

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.时间-尺度小波能量谱

用Python的绘图库(matplotlib)绘制小波能量谱

2.时间小波能量谱

用Python的绘图库(matplotlib)绘制小波能量谱

3.尺度小波能量谱

用Python的绘图库(matplotlib)绘制小波能量谱

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

Python 相关文章推荐
Python使用代理抓取网站图片(多线程)
Mar 14 Python
在win和Linux系统中python命令行运行的不同
Jul 03 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
python中模块查找的原理与方法详解
Aug 11 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
Python绘制股票移动均线的实例
Aug 24 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
django中的数据库迁移的实现
Mar 16 Python
用基于python的appium爬取b站直播消费记录
解决numpy数组互换两行及赋值的问题
Apr 17 #Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
You might like
php blowfish加密解密算法
2016/07/02 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
动态加载iframe
2006/06/16 Javascript
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
react-native使用leanclound消息推送的方法
2018/08/06 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
jQuery实现简单评论功能
2020/08/19 jQuery
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
简单解决Python文件中文编码问题
2015/11/22 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
pandas.cut具体使用总结
2019/06/24 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
python实现智能语音天气预报
2019/12/02 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
春风行动实施方案
2014/03/28 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书