用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)行疊加,那么就可以得到隨尺度因子變換的小波能量譜曲線(xiàn)。把尺度換算成頻率后,這條曲線(xià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)軸名稱(chēng) 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)軸名稱(chēng) 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)文章,希望大家以后多多支持腳本之家!
- python matplotlib庫(kù)直方圖繪制詳解
- python matplotlib庫(kù)繪制條形圖練習(xí)題
- python庫(kù)matplotlib繪制坐標(biāo)圖
- Python如何使用內(nèi)置庫(kù)matplotlib繪制折線(xiàn)圖
- Python利用Matplotlib庫(kù)實(shí)現(xiàn)繪制餅形圖
- 基于Python matplotlib庫(kù)繪制箱線(xiàn)圖
- 利用Python?NumPy庫(kù)及Matplotlib庫(kù)繪制數(shù)學(xué)函數(shù)圖像
- Python進(jìn)階Matplotlib庫(kù)圖繪制
相關(guān)文章
對(duì)pandas寫(xiě)入讀取h5文件的方法詳解
今天小編就為大家分享一篇對(duì)pandas寫(xiě)入讀取h5文件的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12使用python+poco+夜神模擬器進(jìn)行自動(dòng)化測(cè)試實(shí)例
這篇文章主要介紹了使用python+poco+夜神模擬器進(jìn)行自動(dòng)化測(cè)試實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04基于Python編寫(xiě)復(fù)雜密碼圖形化生成工具
這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫(xiě)復(fù)雜密碼圖形化生成工具,支持選擇生成10位和12位復(fù)雜密碼,需要的小伙伴可以參考一下2024-04-04python數(shù)據(jù)可視化Seaborn畫(huà)熱力圖
這篇文章主要介紹了數(shù)據(jù)可視化Seaborn畫(huà)熱力圖,熱力圖的想法其實(shí)很簡(jiǎn)單,用顏色替換數(shù)字,下面我們來(lái)看看文章對(duì)操作過(guò)程的具體介紹吧,需要的小伙伴可以參考一下具體內(nèi)容,希望對(duì)你有所幫助2022-01-01Python實(shí)現(xiàn)計(jì)算圓周率π的值到任意位的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)計(jì)算圓周率π的值到任意位的方法,簡(jiǎn)單分析了圓周率的計(jì)算原理,并結(jié)合實(shí)例形式分析了Python計(jì)算圓周率的相關(guān)操作技巧,需要的朋友可以參考下2018-05-05基于python神經(jīng)卷積網(wǎng)絡(luò)的人臉識(shí)別
這篇文章主要為大家詳細(xì)介紹了基于python神經(jīng)卷積網(wǎng)絡(luò)的人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Python中的單下劃線(xiàn)和雙下劃線(xiàn)使用場(chǎng)景詳解
這篇文章主要介紹了Python中的單下劃線(xiàn)和雙下劃線(xiàn)使用場(chǎng)景詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09