├── LICENSE ├── README.md ├── hhtpywrapper ├── __init__.py ├── eemd.py ├── hsa.py ├── matlab.py └── rcada_emd.mexa64 ├── notebooks ├── XTE_J1550_564_30191011500A_2_13kev_001s_0_2505s.txt ├── example_Su_etal2015.ipynb └── example_Su_etal2017.ipynb ├── requirements.txt └── setup.py /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015, 2016, 2017 Yi-Hao Su 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Python Wrapper for Hilbert–Huang Transform MATLAB Package 2 | ========================================================= 3 | [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/HHTpy/HHTpywrapper/blob/master/LICENSE) 4 | [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.584082.svg)](https://doi.org/10.5281/zenodo.584082) 5 | 6 | 7 | HHTpywrapper instantaneously tracks frequency and amplitude variations of a signal generated by non-stationary and nonlinear processes (e.g., quasi-periodic oscillations of astronomical objects). It uses Python as an interface to call the [Hilbert–Huang Transform (HHT) MATLAB package](http://rcada.ncu.edu.tw/research1.htm). HHT is a time-frequency analysis method to adaptively decompose a signal into basis components at different timescales (i.e., the empirical mode decomposition), and then Hilbert transform these components into instantaneous phases, frequencies and amplitudes as functions of time (i.e., Hilbert spectral analysis). HHT has been successfully applied to analyzing X-ray quasi-periodic oscillations from the active galactic nucleus RE J1034+396 ([Hu et al. 2014](http://adsabs.harvard.edu/abs/2014ApJ...788...31H)) and two black hole X-ray binaries, XTE J1550–564 ([Su et al. 2015](http://adsabs.harvard.edu/abs/2015ApJ...815...74S)) and GX 339-4 (Su et al. 2017). HHTpywrapper provides 8 | examples of reproducing HHT analysis results in [Su et al. (2015)](http://adsabs.harvard.edu/abs/2015ApJ...815...74S) and Su et al. (2017). This project is originated from the [Astro Hack Week 2015](https://github.com/AstroHackWeek/AstroHackWeek2015/). 9 | 10 | Requirements 11 | ------------ 12 | - Linux or Windows operating system (The fast EEMD code in the HHT MATLAB package has not supported Mac yet) 13 | - Python 3.x+ 14 | - MATLAB 15 | - Numpy 16 | - Scipy 17 | - Astropy 18 | - Matplotlib 19 | - [pymatbridge](https://github.com/arokem/python-matlab-bridge) (A simple Python => MATLAB(R) interface and a matlab magic for ipython) 20 | - [pyunpack](https://pypi.python.org/pypi/pyunpack) and [patool](http://wummel.github.io/patool/) (For extracting the .zip/.rar HHT MATLAB package files) 21 | - UNZIP and UNRAR (sudo apt-get install unzip unrar) 22 | 23 | Installation 24 | ------------ 25 | 1. Clone this project from GitHub: 26 | 27 | $ git clone https://github.com/HHTpy/HHTpywrapper.git 28 | 29 | 2. In the project directory, install required packages: 30 | 31 | $ pip install -r requirements.txt 32 | 33 | 3. In the project directory, execute: 34 | 35 | $ python setup.py install 36 | 37 | Examples of Package Usage 38 | ----- 39 | - [Example of reproducing HHT analysis results in Su et al. 2015](https://github.com/HHTpy/HHTpywrapper/blob/master/notebooks/example_Su_etal2015.ipynb) 40 | - [Example of reproducing HHT analysis results in Su et al. 2017](https://github.com/HHTpy/HHTpywrapper/blob/master/notebooks/example_Su_etal2017.ipynb) 41 | - Example of characterizing intermittency of an intermittent, frequency varying oscillation (To be added) 42 | 43 | Directory Structure 44 | ------------------- 45 | After finishing the installation, you can see the below directory structure: 46 | - /Your Python site-packages path/hhtpywrapper/ : 47 | 48 | This is the root directory of the package, including the directory of HHT MATLAB package and the Python API for calling the MATLAB package (eemd.py and hsa.py). 49 | 50 | - /Your Python site-packages path/hhtpywrapper/HHT_MATLAB_package/ : 51 | 52 | This is the base directory of HHT MATLAB package. There are three subdirectories: EEMD, checkIMFs and HSA. 53 | 54 | - /Your Python site-packages path/hhtpywrapper/HHT_MATLAB_package/EEMD/ : 55 | 56 | This directory collects MATLAB M-files for decomposing a signal into basis components (intrinsic mode functions, IMFs) defined by the signal itself. This adaptive decomposition method is called empirical mode decomposition (EMD). The M-files accomplished the most recently developed modified version of EMD, fast complementary ensemble empirical mode decomposition (CEEMD). Reference: 57 | * [The empirical mode decomposition and the Hilbert spectrum for nonlinear and non-stationary time series analysis](http://rcada.ncu.edu.tw/ref/reference002.pdf) 58 | * [Ensemble Empirical Mode Decomposition: a noise-assisted data analysis method](http://rcada.ncu.edu.tw/ref/reference007.pdf) 59 | * [On the computational complexity of the empirical mode decomposition algorithm](http://www.sciencedirect.com/science/article/pii/S0378437114000247) 60 | 61 | 62 | - /Your Python site-packages path/hhtpywrapper/HHT_MATLAB_package/checkIMFs/ : 63 | 64 | This directory collects MATLAB M-files for checking IMF properties, including significance, index of orthogonality, and excessive extrema value. Reference: 65 | * [The empirical mode decomposition and the Hilbert spectrum for nonlinear and non-stationary time series analysis](http://rcada.ncu.edu.tw/ref/reference002.pdf) 66 | * [A confidence limit for the Empirical Mode Decomposition and Hilbert Spectral Analysis](http://rcada.ncu.edu.tw/ref/reference004.pdf) 67 | * [A study of the characteristics of white noise using the empirical mode decomposition method](http://rcada.ncu.edu.tw/ref/reference006.pdf) 68 | * [Ensemble Empirical Mode Decomposition: a noise-assisted data analysis method](http://rcada.ncu.edu.tw/ref/reference007.pdf) 69 | * [On Intrinsic Mode Function](http://rcada.ncu.edu.tw/ref/reference013.pdf) 70 | 71 | 72 | - /Your Python site-packages path/hhtpywrapper/HHT_MATLAB_package/HSA/ : 73 | 74 | This directory collects MATLAB M-files for calculating instantaneous amplitudes, phases and frequencies of IMFs (that is, the Hilbert Spectral Analysis, HSA). Reference: 75 | * [The empirical mode decomposition and the Hilbert spectrum for nonlinear and non-stationary time series analysis](http://rcada.ncu.edu.tw/ref/reference002.pdf) 76 | * [On instantaneous frequency](http://rcada.ncu.edu.tw/ref/reference005.pdf) 77 | 78 | Important Links 79 | --------------- 80 | - [HHT MATLAB package](http://rcada.ncu.edu.tw/research1.htm) 81 | - [References of HHT](http://rcada.ncu.edu.tw/research1_clip_reference.htm) 82 | 83 | Other HHT-related Python Codes 84 | ------------------------------ 85 | - [PyHHT](https://github.com/jaidevd/pyhht) ; [PyHHT’s documentation](http://pyhht.readthedocs.io/en/latest/index.html) (by Jaidev Deshpande) 86 | - [pyeemd](http://pyeemd.readthedocs.io/en/latest/) (by Perttu Luukko) 87 | - [Python implementation of EMD/EEMD](https://laszukdawid.com/codes/) (by Dawid Laszuk) 88 | 89 | Authors 90 | ------- 91 | - [Yi-Hao Su](https://github.com/YihaoSu) (yhsu@astro.ncu.edu.tw)
92 | HHTpywrapper is my project during the [Astro Hack Week 2015](https://github.com/AstroHackWeek/AstroHackWeek2015/). It is currently in development phase. Welcome any contributions and feedbacks! 93 | -------------------------------------------------------------------------------- /hhtpywrapper/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HHTpy/HHTpywrapper/aad57c730b778f99ecf65101d8bdeb86a09fc66c/hhtpywrapper/__init__.py -------------------------------------------------------------------------------- /hhtpywrapper/eemd.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pylab as plt 2 | import numpy as np 3 | import hhtpywrapper.matlab as matlab 4 | 5 | 6 | class EEMD(): 7 | def __init__(self, signal, Nstd, NE, num_imf=0, run_CEEMD=1, max_sift=10, 8 | type_spline=2, modify_BC=1, rand_type=2, seed_no=1, 9 | check_signal=1, post_processing=False): 10 | self.mlab = matlab.start_mlab() 11 | res = self.mlab.run_func('rcada_eemd', signal, Nstd, NE, num_imf, 12 | run_CEEMD, max_sift, type_spline, modify_BC, 13 | rand_type, seed_no, check_signal) 14 | allmode = res['result'].T 15 | num_imf = allmode.shape[1] 16 | if post_processing == True: 17 | imfs = np.zeros((len(signal), num_imf)) 18 | remainder = 0 19 | for i in range(num_imf-1): 20 | res2 = self.mlab.run_func('rcada_eemd', allmode[:,i] + remainder, 0, 1, num_imf) 21 | imfs_temp = res2['result'].T 22 | imfs[:,i] = imfs_temp[:,0] 23 | remainder = allmode[:,i] + remainder - imfs[:,i] 24 | imfs[:,-1] = remainder + allmode[:,-1] 25 | else: 26 | imfs = allmode 27 | self.imfs = imfs 28 | self.input_signal = signal 29 | self.num_imf = num_imf 30 | 31 | def get_oi(self): 32 | oi = self.mlab.run_func('ratio1', self.imfs) 33 | oi_pair = self.mlab.run_func('ratioa', self.imfs) 34 | oi_dic = {'Non-orthogonal leakage of components': oi['result'], 35 | 'Non-orthogonal leakage for pair of adjoining components': oi_pair['result']} 36 | return oi_dic 37 | 38 | def plot_imfs(self, time, tstart=None, tend=None, tunit='s', savefig_name=''): 39 | time = time - time[0] 40 | dt = time[1] - time[0] 41 | if tstart != None: 42 | tstart = int(np.fix(tstart / dt)) 43 | if tend != None: 44 | tend = int(np.fix(tend / dt)) 45 | num_subplot = self.num_imf + 1 46 | fig = plt.figure() 47 | ax = fig.add_subplot(num_subplot, 1, 1) 48 | ax.plot(time[tstart:tend], self.input_signal[tstart:tend]) 49 | ax.set_ylabel('Data') 50 | ax.get_yaxis().set_label_coords(-0.1,0.5) 51 | for i in range(self.num_imf - 1): 52 | ax = fig.add_subplot(num_subplot, 1, i + 2) 53 | ax.plot(time[tstart:tend], self.imfs[:,i][tstart:tend]) 54 | ax.set_ylabel(r'$C_{' + str(i + 1) + '}$') 55 | ax.get_yaxis().set_label_coords(-0.1,0.5) 56 | ax = fig.add_subplot(num_subplot, 1, num_subplot) 57 | ax.plot(time[tstart:tend], self.imfs[:,-1][tstart:tend]) 58 | ax.get_yaxis().set_label_coords(-0.1,0.5) 59 | ax.set_ylabel('Trend') 60 | ax.set_xlabel('Time (' + tunit + ')') 61 | if savefig_name == '': 62 | plt.show() 63 | else: 64 | plt.savefig(savefig_name, format='eps', dpi=1000) 65 | 66 | def plot_imfs_significance(self, imfs, savefig_name=''): 67 | n_pt, n_imf = imfs.shape 68 | if n_pt < n_imf: 69 | imfs = imfs.T 70 | n_pt, n_imf = imfs.shape 71 | res_logep = self.mlab.run_func('significanceIMF', imfs[:,:-1]) 72 | logep = res_logep['result'] 73 | self.mlab.run_code('sigline90=confidenceLine(0.10,' + str(n_pt) + ');' + 74 | 'sigline95=confidenceLine(0.05,' + str(n_pt) + ');' + 75 | 'sigline99=confidenceLine(0.01,' + str(n_pt) + ');') 76 | sigline90 = self.mlab.get_variable('sigline90') 77 | sigline95 = self.mlab.get_variable('sigline95') 78 | sigline99 = self.mlab.get_variable('sigline99') 79 | plt.figure() 80 | plt.plot(sigline90[:,0], sigline90[:,1], 'k', 81 | sigline95[:,0], sigline95[:,1], 'b', 82 | sigline99[:,0], sigline99[:,1], 'r') 83 | plt.legend(('90% significance', '95% significance', '99% significance'), loc=3) 84 | plt.plot(logep[:,0], logep[:,1], 'g.') 85 | plt.xlabel('Log-T, Period of the IMFs (log)') 86 | plt.ylabel('Log-E, Energy of the IMFs (log)') 87 | if savefig_name == '': 88 | plt.show() 89 | else: 90 | plt.savefig(savefig_name, format='eps', dpi=1000) 91 | -------------------------------------------------------------------------------- /hhtpywrapper/hsa.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pylab as plt 2 | import numpy as np 3 | import hhtpywrapper.matlab as matlab 4 | 5 | 6 | class HSA(): 7 | def __init__(self, imfs, dt, ifmethod='hilbtm', normmethod='pchip', nfilter=0): 8 | self.mlab = matlab.start_mlab() 9 | fa_res = self.mlab.run_func('fa', imfs, dt, ifmethod, normmethod, nfilter, nargout=2) 10 | fa = fa_res['result'] 11 | self.imfs = imfs 12 | self.ifmethod = ifmethod 13 | self.normmethod = normmethod 14 | if len(fa[0]) != 1: 15 | ifreq = fa[0] 16 | iamp = fa[1] 17 | else: 18 | ifreq = fa[0].T 19 | iamp = fa[1].T 20 | self.ifreq = ifreq 21 | self.iamp = iamp 22 | 23 | def plot_hs(self, time, trange, frange, tres, fres, hsize, sigma, 24 | tunit='s', funit='Hz', colorbar = 'energy', savefig_name=''): 25 | time = time - time[0] 26 | tstart = trange[0] 27 | tend = trange[1] 28 | fstart = frange[0] 29 | fend = frange[1] 30 | if colorbar == 'amplitude': 31 | runfunc = 'nnspa' 32 | elif colorbar == 'energy': 33 | runfunc = 'nnspe' 34 | res_nnspe = self.mlab.run_func(runfunc, self.imfs, time[0], time[-1], fres, tres, 35 | fstart, fend, tstart, tend, self.ifmethod, 36 | self.normmethod, 0, 0, nargout=3) 37 | nt = res_nnspe['result'][0] 38 | tscale = res_nnspe['result'][1].reshape(-1) 39 | fscale = res_nnspe['result'][2].reshape(-1) 40 | res_fspecial = self.mlab.run_func('fspecial', 'gaussian', hsize, sigma) 41 | q = res_fspecial['result'] 42 | res_filter2 = self.mlab.run_func('filter2', q, nt) 43 | res_nsu = self.mlab.run_func('filter2', q, res_filter2['result']) 44 | nsu = res_nsu['result'] 45 | fig = plt.figure() 46 | ax = plt.axes() 47 | hs = ax.pcolormesh(tscale, fscale, nsu ** 0.5) 48 | cb = plt.colorbar(hs) 49 | cb.set_label('Gaussian smoothing ' + colorbar) 50 | ax.set_ylabel('Frequency (' + funit + ')') 51 | ax.set_xlabel('Time (' + tunit + ')') 52 | if savefig_name == '': 53 | plt.show() 54 | else: 55 | plt.savefig(savefig_name, format='eps', dpi=1000) 56 | -------------------------------------------------------------------------------- /hhtpywrapper/matlab.py: -------------------------------------------------------------------------------- 1 | from pymatbridge import Matlab 2 | import os 3 | 4 | def start_mlab(): 5 | dir_path = os.path.dirname(os.path.realpath(__file__)) 6 | dir_list = ['/HHT_MATLAB_package', '/HHT_MATLAB_package/EEMD', 7 | '/HHT_MATLAB_package/checkIMFs', '/HHT_MATLAB_package/HSA'] 8 | mlab = Matlab() 9 | mlab.start() 10 | for d in dir_list: 11 | res = mlab.run_func('addpath', dir_path + d) 12 | return mlab 13 | -------------------------------------------------------------------------------- /hhtpywrapper/rcada_emd.mexa64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HHTpy/HHTpywrapper/aad57c730b778f99ecf65101d8bdeb86a09fc66c/hhtpywrapper/rcada_emd.mexa64 -------------------------------------------------------------------------------- /notebooks/example_Su_etal2017.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Example of reproducing HHT analysis results in Su et al. 2017\n", 8 | "* Su et al. 2017: \"Tracking X-ray Spectral Modulations of Type-B Quasi-periodic Oscillations in GX 339-4 using Hilbert-Huang Transform\" (To be submitted to the Astrophysical Journal)\n", 9 | "* The example will be publicly available after this paper’s publication" 10 | ] 11 | } 12 | ], 13 | "metadata": { 14 | "kernelspec": { 15 | "display_name": "Python 3", 16 | "language": "python", 17 | "name": "python3" 18 | }, 19 | "language_info": { 20 | "codemirror_mode": { 21 | "name": "ipython", 22 | "version": 3 23 | }, 24 | "file_extension": ".py", 25 | "mimetype": "text/x-python", 26 | "name": "python", 27 | "nbconvert_exporter": "python", 28 | "pygments_lexer": "ipython3", 29 | "version": "3.6.0" 30 | } 31 | }, 32 | "nbformat": 4, 33 | "nbformat_minor": 2 34 | } 35 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | astropy 2 | pyzmq 3 | pymatbridge>=0.5.2 4 | pyunpack>=0.1.1 5 | patool>=1.12 6 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | import os 3 | import shutil 4 | import urllib.request 5 | from pyunpack import Archive 6 | from pymatbridge import Matlab 7 | 8 | NAME = 'hhtpywrapper' 9 | 10 | # VERSION should be PEP440 compatible (https://www.python.org/dev/peps/pep-0440/) 11 | VERSION = '0.1.dev' 12 | 13 | # Define base paths for directories and create directories 14 | HHT_MATLAB_package_root = './hhtpywrapper/HHT_MATLAB_package/' 15 | EEMD_dir = HHT_MATLAB_package_root + 'EEMD/' 16 | HSA_dir = HHT_MATLAB_package_root + 'HSA/' 17 | checkIMFs_dir = HHT_MATLAB_package_root + 'checkIMFs/' 18 | os.mkdir(HHT_MATLAB_package_root) 19 | os.mkdir(HSA_dir) 20 | os.mkdir(checkIMFs_dir) 21 | 22 | # Download and extract the HHT MATLAB package from the RCADA website 23 | print('* Downloading & extracting the HHT MATLAB package...') 24 | urllib.request.urlretrieve('http://in.ncu.edu.tw/ncu34951/FEEMD.rar', 'EEMD.rar') 25 | urllib.request.urlretrieve('http://in.ncu.edu.tw/ncu34951/Matlab_runcode.zip', 26 | 'Matlab_runcode.zip') 27 | Archive('Matlab_runcode.zip').extractall('./') 28 | Archive('EEMD.rar').extractall(EEMD_dir, auto_create_dir=True) 29 | print('...Done.') 30 | 31 | # Rename directories/files & delete unnecessary files 32 | print('* Rearranging directories & files...') 33 | os.rename('Matlab runcode', 'Matlab_runcode') 34 | os.rename('Matlab_runcode/eemd.m', 'Matlab_runcode/eemd_old.m') 35 | os.rename('Matlab_runcode/FAimphilbert.m', 'Matlab_runcode/FAimpHilbert.m') 36 | os.remove('Matlab_runcode/endprocess1.p') 37 | os.remove('Matlab_runcode/ex02d.m') 38 | os.remove('Matlab_runcode/LOD78.csv') 39 | os.remove('Matlab_runcode/LOD-imf.csv') 40 | os.remove('Matlab_runcode/NCU2009V1.txt') 41 | os.remove('Matlab_runcode/test.m') 42 | os.remove(EEMD_dir + 'ref.pdf') 43 | os.remove(EEMD_dir + 'example_eemd.m') 44 | os.remove(EEMD_dir + 'BFVL.mat') 45 | 46 | # Rearrange files 47 | shutil.move('./hhtpywrapper/rcada_emd.mexa64', EEMD_dir) 48 | shutil.move('Matlab_runcode/eemd_old.m', EEMD_dir) 49 | 50 | checkIMFs_mfile_list = ['ratio1.m', 'ratioa.m', 'findEEfsp.m', 'findEE.m', 51 | 'signiplotIMF.m', 'significanceIMF.m', 'ifndq.m', 52 | 'confidenceLine.m', 'dist_value.m', 'extrema.m'] 53 | for files in checkIMFs_mfile_list: 54 | shutil.move('./Matlab_runcode/' + files, checkIMFs_dir) 55 | 56 | HSA_mfile_list = os.listdir('./Matlab_runcode/') 57 | for files in HSA_mfile_list: 58 | shutil.move('./Matlab_runcode/' + files, HSA_dir) 59 | 60 | # Delete unnecessary directories/files 61 | os.remove('EEMD.rar') 62 | os.remove('Matlab_runcode.zip') 63 | os.rmdir('Matlab_runcode') 64 | print('...Done.') 65 | 66 | # Check the MATLAB version & replace the deprecated function with the new one. 67 | mlab = Matlab() 68 | print('* Checking your MATLAB version...') 69 | mlab.start() 70 | mlab.run_code('v = version;') 71 | version = mlab.get_variable('v') 72 | mlab.stop() 73 | print('Your MATLAB version is: ' + version) 74 | version = version.split('.') 75 | if int(version[0]) >= 8: 76 | print('The function "getDefaultStream" in eemd.m is no longer be used ' + 77 | 'in your MATLAB version.') 78 | print('* Replacing it with the function "getGlobalStream"...') 79 | with open(EEMD_dir + 'rcada_eemd.m', 'r', encoding='iso-8859-1') as infile: 80 | data = infile.read().replace('getDefaultStream', 'getGlobalStream') 81 | infile.close() 82 | with open(EEMD_dir + 'rcada_eemd2.m', 'w',encoding='iso-8859-1') as outfile: 83 | outfile.write(data) 84 | outfile.close() 85 | os.remove(EEMD_dir + 'rcada_eemd.m') 86 | os.rename(EEMD_dir + 'rcada_eemd2.m', EEMD_dir + 'rcada_eemd.m') 87 | print('...Done.') 88 | 89 | print('* All done.') 90 | 91 | setup(name=NAME, 92 | version=VERSION, 93 | description='Python Wrapper for Hilbert–Huang Transform MATLAB Package', 94 | install_requires=['numpy', 'scipy', 'matplotlib'], 95 | author='Yi-Hao Su', 96 | author_email='yhsu@astro.ncu.edu.tw', 97 | license='MIT', 98 | packages=find_packages(), 99 | url='https://github.com/HHTpy/HHTpywrapper', 100 | long_description='hhtpywrapper is a python interface to call Hilbert–Huang Transform MATLAB package', 101 | zip_safe=False, 102 | package_data={ 103 | 'hhtpywrapper': ['HHT_MATLAB_package/EEMD/*', 'HHT_MATLAB_package/checkIMFs/*', 104 | 'HHT_MATLAB_package/HSA/*', 'Input_data/*', 105 | 'addpaths.m', 'examples.ipynb'], 106 | }, 107 | ) 108 | --------------------------------------------------------------------------------