def wpi(dataset, n_channels, seq_length): """ function to calculate a wavelet packet energy image # Ding.2017: Energy-Fluctuated Multiscale Feature Learning With Deep ConvNet for Intelligent Spindle Bearing Fault Diagnosis :param dataset: the raw data read from .csv or .npy file :type dataset: ndarray :param n_channels: number of channels :type n_channels: int :param seq_length: length of one data stream of a single sensor :type seq_length: int :return: the flattened images, tupel holding the image size """ level = 10 # choose an even number, paper uses 10 wavelet = 'db8' # Daubechies 8 used in paper # wavelet = 'coif3' # Daubechies 8 used in paper order = "natural" # other option is "freq" clip_energy = 1 # threshold to clip the calculated energy features (negative and positive) num_samples = dataset.shape[0] img_size = np.power(2, level // 2) size_flat = img_size * img_size pics = np.zeros([num_samples, n_channels * size_flat]) # initialize array wp_image = np.zeros([img_size, img_size]) for sample in range(num_samples): # loop over all samples for ch in range(n_channels): # loop over all channels # Construct wavelet packet tree for signal of one channel wp = WaveletPacket(dataset[sample][ch * seq_length:(ch + 1) * seq_length], wavelet, 'symmetric', maxlevel=level) nodes = wp.get_level( level, order=order ) # !required! access the tree to populate it (might be a bug of the library?) i = 0 # loop through the tree (ordered from aaa..a to ddd..d) for node in wp.get_leaf_nodes(): # use only the coefficients from node (i, p) with p = 0..(2^i-1), i.e. set all other coefficients to zero new_wp = WaveletPacket(None, wavelet, 'symmetric', level) new_wp[node.path] = wp[node.path].data # get the reconstruction coefficients (length 2^i) reconst = np.asarray(new_wp.reconstruct(update=False)) # phase shift --> arrange energy features calculated as the squared sum over the reconstruction coefficients wp_image[i % img_size, i // img_size] = np.sum(np.multiply(reconst, reconst), axis=-1) # remove node from wp tree del new_wp[node.path] i += 1 # (!) THP modification (!), clip the wpi to fixed range: especially the approximation coefficients hold a lot of energy which # scales very differently wp_image = np.clip(wp_image, -clip_energy, clip_energy) # collect all pictures, shape (samples, ch1+ch2..) pics[sample][ch * size_flat:(ch + 1) * size_flat] = np.reshape( wp_image, [1, size_flat]) return pics, [img_size, img_size]
def waveletLeafData(waveletPacket: pywt.WaveletPacket): leafData = list() leafNodes = [ node.path for node in waveletPacket.get_level(waveletPacket.maxlevel, 'freq') ] for node in leafNodes: bandData = waveletPacket[node].data leafData.extend(bandData) return leafData
def scalogram_levels(data, fs, filename, wv='sym5' ): from pywt import WaveletPacket wp = WaveletPacket(data, wavelet=wv , maxlevel=2) pylab.bone() x = np.arange(len(data))/fs pylab.subplot(wp.maxlevel + 1, 1, 1) pylab.plot(x,data, 'k') cm = plt.get_cmap('PiYG') #pylab.xlim(0, len(data) - 1) pylab.title("Wavelet packet coefficients") #ax = pylab.subplot(wp.maxlevel + 1, 1, 1+1) for i in range(1, wp.maxlevel + 1): ax = pylab.subplot(wp.maxlevel + 1, 1, i + 1) nodes = wp.get_level(i, "freq") nodes.reverse() labels = [n.path for n in nodes] values = -abs(np.array([n.data for n in nodes])) pylab.imshow(values, interpolation='nearest', aspect='auto', origin="lower") #extent=[0,1,2,len(values)]) pylab.yticks(np.arange(len(labels) - 0.5, -0.5, -1), labels) pylab.setp(ax.get_xticklabels(), visible=False) pylab.savefig(filename+'_'+wv+'.pdf')
def scalogram(data, fs, filename,level=4,order="freq",wv='sym5'): from pywt import WaveletPacket x = np.arange(len(data))/fs cm = plt.get_cmap('prism') wp = WaveletPacket(data,wavelet=wv , maxlevel=level) nodes = wp.get_level(level, order=order) labels = [n.path for n in nodes] values = pylab.array([n.data for n in nodes], 'd') values = abs(values) f = pylab.figure() f.subplots_adjust(hspace=0.2, bottom=.03, left=.07, right=.97, top=.92) pylab.subplot(2, 1, 1) pylab.title("signal") pylab.plot(x, data, 'b') pylab.xlim(0, x[-1]) ax = pylab.subplot(2, 1, 2) pylab.title("Wavelet packet coefficients at level %d" % level) pylab.imshow(values, interpolation="nearest", cmap=cm, aspect="auto", origin="lower", extent=[0, 1, 0, len(values)]) pylab.yticks(pylab.arange(0.5, len(labels) + 0.5), labels) pylab.savefig(filename+'_'+wv+'.pdf')
def getSumOfBandsPercentages(signal): wp = WaveletPacket(data = signal, wavelet = 'db4', maxlevel = 6) nodes = [node.path for node in wp.get_level(6, 'natural')] delta = np.sum(np.abs(wp[nodes[0]].data)) theta = np.sum(np.abs(wp[nodes[1]].data)) alpha = np.sum(np.abs(wp[nodes[2]].data)) beta = 0 gamma = 0 for i in range(3, 9): beta += np.sum(np.abs(wp[nodes[i]].data)) for i in range(9, 14): gamma += np.sum(np.abs(wp[nodes[i]].data)) bands = [delta, theta, alpha, beta, gamma] sum = np.sum(bands) percentages = bands/sum percentages *= 100 return percentages
def morphWaveletPacket(originalPacket: pywt.WaveletPacket, targetPacket=None, steps=1): if targetPacket == None: return originalPacket result = [] morphed = pywt.WaveletPacket(data=None, wavelet='db8', mode='symmetric') leafNodes = [ node.path for node in originalPacket.get_level(originalPacket.maxlevel, 'freq') ] for node in leafNodes: originalData = originalPacket[node].data targetData = targetPacket[node].data dataDiff = originalData - targetData
def apply_wavelet_ICA(EEGdata): """ apply wavelet decomposition and ICA to EEGdata """ terminal_nodes = ['aa', 'ad', 'da', 'dd'] # labels for level 2 nodes in WaveletPacket tree T = len(terminal_nodes) N, _ = EEGdata.shape # no. channels wavePacks = [] waveData = [[] for i in range(T)] for c in range(N): wavePacket = WaveletPacket(data=EEGdata[c, :], wavelet='sym4', maxlevel=2) wavePacks.append(wavePacket) for i, n in enumerate(terminal_nodes): waveData[i].append(wavePacket[n].data) mixMat, V, X = sobi_fast(np.array(waveData[0])) ICs = [np.matmul(np.transpose(V), X)] ICs += [np.array(wp) for wp in waveData[1:]] return ICs, mixMat, wavePacks, terminal_nodes
def wave_fea(a): wp = WaveletPacket(a, 'db1', maxlevel=8) nodes = wp.get_level(8, "freq") return np.linalg.norm(np.array([n.data for n in nodes]), 2)
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy import pylab from pywt import WaveletPacket x = numpy.arange(612 - 80, 20, -0.5) / 150.0 data = numpy.sin(20 * pylab.log(x)) * numpy.sign((pylab.log(x))) from sample_data import ecg as data wp = WaveletPacket(data, "sym5", maxlevel=4) pylab.bone() pylab.subplot(wp.maxlevel + 1, 1, 1) pylab.plot(data, "k") pylab.xlim(0, len(data) - 1) pylab.title("Wavelet packet coefficients") for i in range(1, wp.maxlevel + 1): ax = pylab.subplot(wp.maxlevel + 1, 1, i + 1) nodes = wp.get_level(i, "freq") nodes.reverse() labels = [n.path for n in nodes] values = -abs(numpy.array([n.data for n in nodes])) pylab.imshow(values, interpolation="nearest", aspect="auto") pylab.yticks(numpy.arange(len(labels) - 0.5, -0.5, -1), labels) pylab.setp(ax.get_xticklabels(), visible=False) pylab.show()
import pandas as pd from pywt import WaveletPacket import pywt.data ecg = pywt.data.ecg() df = pd.read_csv('sp.csv') tmp = df['Close'].tolist() tmp2 = df['Open'].tolist() diff = [] for i in range(0, len(tmp)): diff.append(tmp[i] - tmp2[i]) data3 = diff wp = WaveletPacket(data3, 'sym5', maxlevel=4) fig = plt.figure() plt.set_cmap('bone') ax = fig.add_subplot(wp.maxlevel + 1, 1, 1) ax.plot(ecg, 'k') ax.set_xlim(0, len(ecg) - 1) ax.set_title("Wavelet packet coefficients") for level in range(1, wp.maxlevel + 1): ax = fig.add_subplot(wp.maxlevel + 1, 1, level + 1) nodes = wp.get_level(level, "freq") nodes.reverse() labels = [n.path for n in nodes] values = -abs(np.array([n.data for n in nodes])) ax.imshow(values, interpolation='nearest', aspect='auto')
def wavlet_barkms(x,wname,fs): """ decompose speech into 5 layers wavelet packet according to wnmae :param x: :param wname: wavelet generating function :param fs: 8000 :return y: 17 BASK sub-band filter """ if fs != 8000: print('fs must be 8000Hz, change fs!!!') return y = np.zeros((17, len(x))) n = 5 # decomposition level T = WaveletPacket(data=x, wavelet=wname, maxlevel=n, mode='zero') # 一维小波包分解 new_wp = WaveletPacket(data=np.zeros(len(x)), wavelet='db2', mode='zero') # 计算各节点对应系数 map = [] NodeName = [] for row in range(n): map.append([]) NodeName.append([]) for i in [node.path for node in T.get_level(level=row + 1, order='natural')]: map[row].append(T[i].data) NodeName[row].append(i) # 按指定的节点,对时间序列分解的一位小波包系数重构 for i in range(8): new_wp[NodeName[4][i]] = map[4][i] y[i, :] = new_wp.reconstruct(update=False) new_wp = WaveletPacket(data=np.zeros(len(x)), wavelet=wname, mode='zero') new_wp[NodeName[3][4]] = map[3][4] y[8, :] = new_wp.reconstruct(update=False) new_wp = WaveletPacket(data=np.zeros(len(x)), wavelet=wname, mode='zero') new_wp[NodeName[3][5]] = map[3][5] y[9, :] = new_wp.reconstruct(update=False) new_wp = WaveletPacket(data=np.zeros(len(x)), wavelet=wname, mode='zero') new_wp[NodeName[4][11]] = map[4][11] y[10, :] = new_wp.reconstruct(update=False) new_wp = WaveletPacket(data=np.zeros(len(x)), wavelet=wname, mode='zero') new_wp[NodeName[4][12]] = map[4][12] y[11, :] = new_wp.reconstruct(update=False) new_wp = WaveletPacket(data=np.zeros(len(x)), wavelet=wname, mode='zero') new_wp[NodeName[3][7]] = map[3][7] y[12, :] = new_wp.reconstruct(update=False) new_wp = WaveletPacket(data=np.zeros(len(x)), wavelet=wname, mode='zero') for i in range(4, 8): new_wp[NodeName[2][i]] = map[2][i] y[9 + i, :] = new_wp.reconstruct(update=False) new_wp = WaveletPacket(data=np.zeros(len(x)), wavelet=wname, mode='zero') return y
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import numpy as np import matplotlib.pyplot as plt from pywt import WaveletPacket import pywt.data ecg = pywt.data.ecg() wp = WaveletPacket(ecg, 'sym5', maxlevel=4) fig = plt.figure() plt.set_cmap('bone') ax = fig.add_subplot(wp.maxlevel + 1, 1, 1) ax.plot(ecg, 'k') ax.set_xlim(0, len(ecg) - 1) ax.set_title("Wavelet packet coefficients") for level in range(1, wp.maxlevel + 1): ax = fig.add_subplot(wp.maxlevel + 1, 1, level + 1) nodes = wp.get_level(level, "freq") nodes.reverse() labels = [n.path for n in nodes] values = -abs(np.array([n.data for n in nodes])) ax.imshow(values, interpolation='nearest', aspect='auto') ax.set_yticks(np.arange(len(labels) - 0.5, -0.5, -1), labels)
#!/usr/bin/env python # -*- coding: utf-8 -*- from pywt import WaveletPacket wp = WaveletPacket(range(16), 'db2', maxlevel=3) print [node.path for node in wp.get_leaf_nodes(decompose=False)] print [node.path for node in wp.get_leaf_nodes(decompose=True)] coeffs = [(node.path, node.data) for node in wp.get_leaf_nodes(decompose=True)] print coeffs wp2 = WaveletPacket(None, 'db2', maxlevel=3) for path, data in coeffs: wp2[path] = data #print wp["a"] print [node.path for node in wp2.get_leaf_nodes(decompose=False)] print wp2.reconstruct()
#!/usr/bin/env python # -*- coding: utf-8 -*- from pywt import WaveletPacket wp = WaveletPacket(range(16), 'db1', maxlevel=3) print [node.path for node in wp.get_nonzero(False)] print [node.path for node in wp.get_nonzero(True)] coeffs = [(node.path, node.data) for node in wp.get_nonzero(True)] print coeffs wp = WaveletPacket(None, 'db1', maxlevel=3) for path, data in coeffs: wp[path] = data #print wp["a"] print [node.path for node in wp.get_nonzero()] print wp.reconstruct()
import os import numpy as np import matplotlib.pyplot as plt from pywt import WaveletPacket import pywt.data ecg = pywt.data.ecg() wp = WaveletPacket(ecg, 'sym5', maxlevel=4) fig = plt.figure() plt.set_cmap('bone') ax = fig.add_subplot(wp.maxlevel + 1, 1, 1) ax.plot(ecg, 'k') ax.set_xlim(0, len(ecg) - 1) ax.set_title("Wavelet packet coefficients") for level in range(1, wp.maxlevel + 1): ax = fig.add_subplot(wp.maxlevel + 1, 1, level + 1) nodes = wp.get_level(level, "freq") nodes.reverse() labels = [n.path for n in nodes] values = -abs(np.array([n.data for n in nodes])) ax.imshow(values, interpolation='nearest', aspect='auto') ax.set_yticks(np.arange(len(labels) - 0.5, -0.5, -1), labels) plt.setp(ax.get_xticklabels(), visible=False) plt.show()
#!/usr/bin/env python # -*- coding: utf-8 -*- from pywt import WaveletPacket wp = WaveletPacket(range(16), 'db2', maxlevel=3) print[node.path for node in wp.get_leaf_nodes(decompose=False)] print[node.path for node in wp.get_leaf_nodes(decompose=True)] coeffs = [(node.path, node.data) for node in wp.get_leaf_nodes(decompose=True)] print coeffs wp2 = WaveletPacket(None, 'db2', maxlevel=3) for path, data in coeffs: wp2[path] = data #print wp["a"] print[node.path for node in wp2.get_leaf_nodes(decompose=False)] print wp2.reconstruct()