用Python的繪圖庫(kù)(matplotlib)繪制小波能量譜
時(shí)間小波能量譜
- 反映信號(hào)的小波能量沿時(shí)間軸的分布。
由于小波變換具有等距效應(yīng),所以有:

式中

表示信號(hào)強(qiáng)度,對(duì)于式①在平移因子b方向上進(jìn)行加權(quán)積分

式中

代表時(shí)間-小能量譜
尺度小波能量譜
- 反映信號(hào)的小波能量隨尺度的變化情況。
同理,對(duì)式①在尺度方向上進(jìn)行加權(quán)積分:

式中

連續(xù)小波變換
- 連續(xù)小波變換的結(jié)果是一個(gè)小波系數(shù)矩陣,隨著尺度因子和位移因子變化。然后將系數(shù)平方后得到小波能量,把每個(gè)尺度因子對(duì)應(yīng)的所有小波能量進(jìn)行疊加,那么就可以得到隨尺度因子變換的小波能量譜曲線。把尺度換算成頻率后,這條曲線就可視為是頻譜圖。
代碼如下:
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
# 解決負(fù)號(hào)顯示問(wèn)題
plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問(wèn)題
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' 小波基函數(shù)
# 時(shí)間-尺度小波能量譜
def time_scale_spectrum():
coefs, freqs = pywt.cwt(y, scale, wavelet) # np.arange(1, 31) 第一個(gè)參數(shù)必須 >=1 'morl' 'gaus1'
scale_freqs = np.power(freqs, -1) # 對(duì)頻率freqs 取倒數(shù)變?yōu)槌叨?
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')
# 設(shè)置三個(gè)坐標(biāo)軸信息
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()
# 時(shí)間小波能量譜
def time_spectrum():
coefs, freqs = pywt.cwt(y, scale, wavelet)
coefs_pow = np.power(coefs, 2) # 對(duì)二維數(shù)組中的數(shù)平方
spectrum_value = [0] * row # len(freqs)
# 將二維數(shù)組按照里程疊加每個(gè)里程上的所有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
# 坐標(biāo)軸名稱
T1.set_xlabel('$time$', fontsize=15, fontdict=font1) # fontdict設(shè)置子圖字體
T1.set_ylabel('$E/mm^2$', fontsize=15, fontdict=font1)
# 坐標(biāo)刻度值字體大小
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) # 對(duì)二維數(shù)組中的數(shù)平方
scale_freqs = np.power(freqs, -1) # 對(duì)頻率freqs 取倒數(shù)變?yōu)槌叨?
spectrum_value = [0] * len(freqs) # len(freqs)
# 將二維數(shù)組按照里程疊加每個(gè)里程上的所有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
# 坐標(biāo)軸名稱
T1.set_xlabel('$Scale$', fontsize=15, fontdict=font1) # fontdict設(shè)置子圖字體
T1.set_ylabel('$E/mm^2$', fontsize=15, fontdict=font1)
# 坐標(biāo)刻度值字體大小
T1.tick_params(labelsize=15)
plt.show()
# 通過(guò)調(diào)用下面三個(gè)不同的函數(shù)選擇繪制能量譜
time_scale_spectrum()
# time_spectrum()
# scale_spectrum()
最終繪制的能量譜圖如下:
1.時(shí)間-尺度小波能量譜

2.時(shí)間小波能量譜

3.尺度小波能量譜

到此這篇關(guān)于用Python的繪圖庫(kù)(matplotlib)繪制小波能量譜的文章就介紹到這了,希望對(duì)你有幫助,更多相關(guān)用Python繪制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)希爾伯特變換(Hilbert transform)的示例代碼
希爾伯特變換(Hilbert transform)是一個(gè)對(duì)函數(shù)產(chǎn)生定義域相同的函數(shù)的線性算子,而且希爾伯特變換在信號(hào)處理中很重要,所以本文和大家分享了Python實(shí)現(xiàn)希爾伯特變換的代碼,需要的可以參考一下2023-04-04
Python使用qrcode庫(kù)實(shí)現(xiàn)生成二維碼的操作指南
二維碼是一種廣泛使用的二維條碼,因其高效的數(shù)據(jù)存儲(chǔ)能力和易于掃描的特點(diǎn),廣泛應(yīng)用于支付、身份驗(yàn)證、營(yíng)銷推廣等領(lǐng)域,Python qrcode 庫(kù)是一個(gè)生成二維碼的工具,它能夠幫助我們輕松地生成二維碼,在本文中,我們將深入解析 qrcode 庫(kù)的使用方法及其實(shí)際應(yīng)用2025-01-01
python中np.random.permutation函數(shù)實(shí)例詳解
np.random.permutation是numpy中的一個(gè)函數(shù),它可以將一個(gè)數(shù)組中的元素隨機(jī)打亂,返回一個(gè)打亂后的新數(shù)組,下面這篇文章主要給大家介紹了關(guān)于python中np.random.permutation函數(shù)的相關(guān)資料,需要的朋友可以參考下2023-04-04
python 并發(fā)下載器實(shí)現(xiàn)方法示例
這篇文章主要介紹了python 并發(fā)下載器實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了并發(fā)下載器相關(guān)原理及Python并發(fā)下載視頻的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
OpenCV圖像縮放resize各種插值方式的比較實(shí)現(xiàn)
OpenCV提供了resize函數(shù)來(lái)改變圖像的大小,本文主要介紹了OpenCV圖像縮放resize各種插值方式的比較實(shí)現(xiàn),分享給大家,感興趣的可以了解一下2021-06-06
Python生成驗(yàn)證碼、計(jì)算具體日期是一年中的第幾天實(shí)例代碼詳解
這篇文章主要介紹了Python生成驗(yàn)證碼、計(jì)算具體日期是一年中的第幾天,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
mac系統(tǒng)裝python后pip命令不能用的解決方案
這篇文章主要介紹了mac系統(tǒng)裝python后pip命令不能用的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

