Example #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]
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
Example #3
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
Example #4
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
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)
Example #6
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')
Example #7
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)
    plt.setp(ax.get_xticklabels(), visible=False)
Example #8
0
#!/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()