コード例 #1
0
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]
コード例 #2
0
ファイル: waveletHelper.py プロジェクト: ttgkowalski/Artic
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
コード例 #3
0
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')
コード例 #4
0
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')
コード例 #5
0
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
コード例 #6
0
ファイル: waveletHelper.py プロジェクト: ttgkowalski/Artic
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
コード例 #7
0
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
コード例 #8
0
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)
コード例 #9
0
#!/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()
コード例 #10
0
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')
コード例 #11
0
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
コード例 #12
0
#!/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)
コード例 #13
0
ファイル: wp_tree.py プロジェクト: 000Nelson000/pywt
#!/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()
コード例 #14
0
ファイル: wp_tree.py プロジェクト: jpcoles/jcode
#!/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()
コード例 #15
0
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()
コード例 #16
0
ファイル: wp_tree.py プロジェクト: zhengjing8628/pywt
#!/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()