用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的函数嵌套的使用方法
Jan 24 Python
Python中encode()方法的使用简介
May 18 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
python 剪切移动文件的实现代码
Aug 02 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
python对文件的操作方法汇总
Feb 28 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 Python
Django如何与Ajax交互
Apr 29 Python
Python中zipfile压缩包模块的使用
May 14 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
mysql5详细安装教程
2007/01/15 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
Raphael带文本标签可拖动的图形实现代码
2013/02/20 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
js实现表格单列按字母排序
2020/08/12 Javascript
Python实现检测文件MD5值的方法示例
2018/04/11 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
如何验证python安装成功
2020/07/06 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
化工专业个人的求职信范文
2013/11/28 职场文书
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
死亡诗社观后感
2015/06/05 职场文书
婚庆主持词大全
2015/06/30 职场文书
入队仪式主持词
2015/07/04 职场文书
运动会运动员赞词
2015/07/22 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android