mirror of
https://github.com/simon987/wavelib.git
synced 2025-04-10 14:06:46 +00:00
269 lines
5.8 KiB
C
269 lines
5.8 KiB
C
#ifndef WAVELIB_H_
|
|
#define WAVELIB_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#if defined(_MSC_VER)
|
|
#pragma warning(disable : 4200)
|
|
#pragma warning(disable : 4996)
|
|
#endif
|
|
|
|
#ifndef fft_type
|
|
#define fft_type double
|
|
#endif
|
|
|
|
#ifndef cplx_type
|
|
#define cplx_type double
|
|
#endif
|
|
|
|
|
|
typedef struct cplx_t {
|
|
cplx_type re;
|
|
cplx_type im;
|
|
} cplx_data;
|
|
|
|
typedef struct wave_set* wave_object;
|
|
|
|
wave_object wave_init(char* wname);
|
|
|
|
struct wave_set{
|
|
char wname[50];
|
|
int filtlength;// When all filters are of the same length. [Matlab uses zero-padding to make all filters of the same length]
|
|
int lpd_len;// Default filtlength = lpd_len = lpr_len = hpd_len = hpr_len
|
|
int hpd_len;
|
|
int lpr_len;
|
|
int hpr_len;
|
|
double *lpd;
|
|
double *hpd;
|
|
double *lpr;
|
|
double *hpr;
|
|
double params[0];
|
|
};
|
|
|
|
typedef struct fft_t {
|
|
fft_type re;
|
|
fft_type im;
|
|
} fft_data;
|
|
|
|
typedef struct fft_set* fft_object;
|
|
|
|
fft_object fft_init(int N, int sgn);
|
|
|
|
struct fft_set{
|
|
int N;
|
|
int sgn;
|
|
int factors[64];
|
|
int lf;
|
|
int lt;
|
|
fft_data twiddle[1];
|
|
};
|
|
|
|
typedef struct fft_real_set* fft_real_object;
|
|
|
|
fft_real_object fft_real_init(int N, int sgn);
|
|
|
|
struct fft_real_set{
|
|
fft_object cobj;
|
|
fft_data twiddle2[1];
|
|
};
|
|
|
|
typedef struct conv_set* conv_object;
|
|
|
|
conv_object conv_init(int N, int L);
|
|
|
|
struct conv_set{
|
|
fft_real_object fobj;
|
|
fft_real_object iobj;
|
|
int ilen1;
|
|
int ilen2;
|
|
int clen;
|
|
};
|
|
|
|
typedef struct wt_set* wt_object;
|
|
|
|
wt_object wt_init(wave_object wave,char* method, int siglength, int J);
|
|
|
|
struct wt_set{
|
|
wave_object wave;
|
|
conv_object cobj;
|
|
char method[10];
|
|
int siglength;// Length of the original signal.
|
|
int outlength;// Length of the output DWT vector
|
|
int lenlength;// Length of the Output Dimension Vector "length"
|
|
int J; // Number of decomposition Levels
|
|
int MaxIter;// Maximum Iterations J <= MaxIter
|
|
int even;// even = 1 if signal is of even length. even = 0 otherwise
|
|
char ext[10];// Type of Extension used - "per" or "sym"
|
|
char cmethod[10]; // Convolution Method - "direct" or "FFT"
|
|
|
|
int N; //
|
|
int cfftset;
|
|
int zpad;
|
|
int length[102];
|
|
double *output;
|
|
double params[0];
|
|
};
|
|
|
|
typedef struct wtree_set* wtree_object;
|
|
|
|
wtree_object wtree_init(wave_object wave, int siglength, int J);
|
|
|
|
struct wtree_set{
|
|
wave_object wave;
|
|
conv_object cobj;
|
|
char method[10];
|
|
int siglength;// Length of the original signal.
|
|
int outlength;// Length of the output DWT vector
|
|
int lenlength;// Length of the Output Dimension Vector "length"
|
|
int J; // Number of decomposition Levels
|
|
int MaxIter;// Maximum Iterations J <= MaxIter
|
|
int even;// even = 1 if signal is of even length. even = 0 otherwise
|
|
char ext[10];// Type of Extension used - "per" or "sym"
|
|
|
|
int N; //
|
|
int nodes;
|
|
int cfftset;
|
|
int zpad;
|
|
int length[102];
|
|
double *output;
|
|
int *nodelength;
|
|
int *coeflength;
|
|
double params[0];
|
|
};
|
|
|
|
typedef struct wpt_set* wpt_object;
|
|
|
|
wpt_object wpt_init(wave_object wave, int siglength, int J);
|
|
|
|
struct wpt_set{
|
|
wave_object wave;
|
|
conv_object cobj;
|
|
int siglength;// Length of the original signal.
|
|
int outlength;// Length of the output DWT vector
|
|
int lenlength;// Length of the Output Dimension Vector "length"
|
|
int J; // Number of decomposition Levels
|
|
int MaxIter;// Maximum Iterations J <= MaxIter
|
|
int even;// even = 1 if signal is of even length. even = 0 otherwise
|
|
char ext[10];// Type of Extension used - "per" or "sym"
|
|
char entropy[20];
|
|
double eparam;
|
|
|
|
int N; //
|
|
int nodes;
|
|
int length[102];
|
|
double *output;
|
|
double *costvalues;
|
|
double *basisvector;
|
|
int *nodeindex;
|
|
int *numnodeslevel;
|
|
int *coeflength;
|
|
double params[0];
|
|
};
|
|
|
|
|
|
typedef struct cwt_set* cwt_object;
|
|
|
|
cwt_object cwt_init(char* wave, double param, int siglength,double dt, int J);
|
|
|
|
struct cwt_set{
|
|
char wave[10];// Wavelet - morl/morlet,paul,dog/dgauss
|
|
int siglength;// Length of Input Data
|
|
int J;// Total Number of Scales
|
|
double s0;// Smallest scale. It depends on the sampling rate. s0 <= 2 * dt for most wavelets
|
|
double dt;// Sampling Rate
|
|
double dj;// Separation between scales. eg., scale = s0 * 2 ^ ( [0:N-1] *dj ) or scale = s0 *[0:N-1] * dj
|
|
char type[10];// Scale Type - Power or Linear
|
|
int pow;// Base of Power in case type = pow. Typical value is pow = 2
|
|
int sflag;
|
|
int pflag;
|
|
int npad;
|
|
int mother;
|
|
double m;// Wavelet parameter param
|
|
double smean;// Input Signal mean
|
|
|
|
cplx_data *output;
|
|
double *scale;
|
|
double *period;
|
|
double *coi;
|
|
double params[0];
|
|
};
|
|
|
|
|
|
void dwt(wt_object wt, double *inp);
|
|
|
|
void idwt(wt_object wt, double *dwtop);
|
|
|
|
void wtree(wtree_object wt, double *inp);
|
|
|
|
void dwpt(wpt_object wt, double *inp);
|
|
|
|
void idwpt(wpt_object wt, double *dwtop);
|
|
|
|
void swt(wt_object wt, double *inp);
|
|
|
|
void iswt(wt_object wt, double *swtop);
|
|
|
|
void modwt(wt_object wt, double *inp);
|
|
|
|
void imodwt(wt_object wt, double *dwtop);
|
|
|
|
void setDWTExtension(wt_object wt, char *extension);
|
|
|
|
void setWTREEExtension(wtree_object wt, char *extension);
|
|
|
|
void setDWPTExtension(wpt_object wt, char *extension);
|
|
|
|
void setDWPTEntropy(wpt_object wt, char *entropy, double eparam);
|
|
|
|
void setWTConv(wt_object wt, char *cmethod);
|
|
|
|
int getWTREENodelength(wtree_object wt, int X);
|
|
|
|
void getWTREECoeffs(wtree_object wt, int X, int Y, double *coeffs, int N);
|
|
|
|
int getDWPTNodelength(wpt_object wt, int X);
|
|
|
|
void getDWPTCoeffs(wpt_object wt, int X, int Y, double *coeffs, int N);
|
|
|
|
void setCWTScales(cwt_object wt, double s0, double dj, char *type, int power);
|
|
|
|
void setCWTScaleVector(cwt_object wt, double *scale, int J, double s0, double dj);
|
|
|
|
void setCWTPadding(cwt_object wt, int pad);
|
|
|
|
void cwt(cwt_object wt, double *inp);
|
|
|
|
void icwt(cwt_object wt, double *cwtop);
|
|
|
|
int getCWTScaleLength(int N);
|
|
|
|
void wave_summary(wave_object obj);
|
|
|
|
void wt_summary(wt_object wt);
|
|
|
|
void wtree_summary(wtree_object wt);
|
|
|
|
void wpt_summary(wpt_object wt);
|
|
|
|
void cwt_summary(cwt_object wt);;
|
|
|
|
void wave_free(wave_object object);
|
|
|
|
void wt_free(wt_object object);
|
|
|
|
void wtree_free(wtree_object object);
|
|
|
|
void wpt_free(wpt_object object);
|
|
|
|
void cwt_free(cwt_object object);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif /* WAVELIB_H_ */
|