mirror of
https://github.com/simon987/wavelib.git
synced 2025-04-19 18:16:44 +00:00
commit : visushrink/sureshrink added for dwt/swt
This commit is contained in:
parent
bd2314727e
commit
a26e271971
@ -1,12 +1,12 @@
|
|||||||
|
|
||||||
#include "denoise.h"
|
#include "denoise.h"
|
||||||
|
|
||||||
void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,double *denoised) {
|
void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,char *level,double *denoised) {
|
||||||
int filt_len,iter,i,dlen,dwt_len,sgn, MaxIter;
|
int filt_len,iter,i,dlen,dwt_len,sgn, MaxIter,it;
|
||||||
double sigma,td,tmp;
|
double sigma,td,tmp;
|
||||||
wave_object wave;
|
wave_object wave;
|
||||||
wt_object wt;
|
wt_object wt;
|
||||||
double *dout;
|
double *dout,*lnoise;
|
||||||
|
|
||||||
wave = wave_init(wname);
|
wave = wave_init(wname);
|
||||||
|
|
||||||
@ -29,8 +29,11 @@ void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,ch
|
|||||||
modwt(wt,signal);
|
modwt(wt,signal);
|
||||||
} else {
|
} else {
|
||||||
printf("Acceptable WT methods are - dwt,swt and modwt\n");
|
printf("Acceptable WT methods are - dwt,swt and modwt\n");
|
||||||
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lnoise = (double*)malloc(sizeof(double) * J);
|
||||||
|
|
||||||
//Set sigma
|
//Set sigma
|
||||||
|
|
||||||
iter = wt->length[0];
|
iter = wt->length[0];
|
||||||
@ -38,6 +41,7 @@ void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,ch
|
|||||||
|
|
||||||
dout = (double*)malloc(sizeof(double) * dlen);
|
dout = (double*)malloc(sizeof(double) * dlen);
|
||||||
|
|
||||||
|
if(!strcmp(level,"first")) {
|
||||||
for (i = 1; i < J; ++i) {
|
for (i = 1; i < J; ++i) {
|
||||||
iter += wt->length[i];
|
iter += wt->length[i];
|
||||||
}
|
}
|
||||||
@ -46,30 +50,54 @@ void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,ch
|
|||||||
dout[i] = fabs(wt->output[iter+i]);
|
dout[i] = fabs(wt->output[iter+i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
sigma = median(dout,dlen);
|
sigma = median(dout,dlen) / 0.6745;
|
||||||
|
for(it = 0; it < J;++it) {
|
||||||
|
lnoise[it] = sigma;
|
||||||
|
}
|
||||||
|
} else if(!strcmp(level,"all")){
|
||||||
|
for(it = 0; it < J;++it) {
|
||||||
|
dlen = wt->length[it+1];
|
||||||
|
for(i = 0; i < dlen;++i) {
|
||||||
|
dout[i] = fabs(wt->output[iter+i]);
|
||||||
|
}
|
||||||
|
sigma = median(dout,dlen) / 0.6745;
|
||||||
|
lnoise[it] = sigma;
|
||||||
|
iter += dlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
printf("Acceptable Noise estimation level values are - first and all \n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
dwt_len = wt->outlength;
|
dwt_len = wt->outlength;
|
||||||
|
iter = wt->length[0];
|
||||||
td = sqrt(2.0 * log(dwt_len)) * sigma / 0.6745;
|
for(it = 0; it < J;++it) {
|
||||||
|
sigma = lnoise[it];
|
||||||
|
dlen = wt->length[it+1];
|
||||||
|
td = sqrt(2.0 * log(dwt_len)) * sigma;
|
||||||
|
|
||||||
if(!strcmp(thresh,"hard")) {
|
if(!strcmp(thresh,"hard")) {
|
||||||
for(i = wt->length[0]; i < dwt_len;++i) {
|
for(i = 0; i < dlen;++i) {
|
||||||
if (fabs(wt->output[i]) < td) {
|
if (fabs(wt->output[iter+i]) < td) {
|
||||||
wt->output[i] = 0;
|
wt->output[iter+i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(!strcmp(thresh,"soft")) {
|
} else if(!strcmp(thresh,"soft")) {
|
||||||
for(i = wt->length[0]; i < dwt_len;++i) {
|
for(i = 0; i < dlen;++i) {
|
||||||
if (fabs(wt->output[i]) < td) {
|
if (fabs(wt->output[iter + i]) < td) {
|
||||||
wt->output[i] = 0;
|
wt->output[iter+i] = 0;
|
||||||
} else {
|
} else {
|
||||||
sgn = wt->output[i] >= 0 ? 1 : -1;
|
sgn = wt->output[iter+i] >= 0 ? 1 : -1;
|
||||||
tmp = sgn * (fabs(wt->output[i]) - td);
|
tmp = sgn * (fabs(wt->output[iter+i]) - td);
|
||||||
wt->output[i] = tmp;
|
wt->output[iter+i] = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iter += wt->length[it+1];
|
||||||
|
}
|
||||||
|
|
||||||
if(!strcmp(method,"dwt")) {
|
if(!strcmp(method,"dwt")) {
|
||||||
idwt(wt,denoised);
|
idwt(wt,denoised);
|
||||||
} else if(!strcmp(method,"swt")) {
|
} else if(!strcmp(method,"swt")) {
|
||||||
@ -79,16 +107,17 @@ void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,ch
|
|||||||
}
|
}
|
||||||
|
|
||||||
free(dout);
|
free(dout);
|
||||||
|
free(lnoise);
|
||||||
wave_free(wave);
|
wave_free(wave);
|
||||||
wt_free(wt);
|
wt_free(wt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,double *denoised) {
|
void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,char *level,double *denoised) {
|
||||||
int filt_len,i,it,len,dlen,dwt_len,min_index,sgn, MaxIter,iter;
|
int filt_len,i,it,len,dlen,dwt_len,min_index,sgn, MaxIter,iter;
|
||||||
double sigma,norm,td,tv,te,ct,thr,temp,x_sum;
|
double sigma,norm,td,tv,te,ct,thr,temp,x_sum;
|
||||||
wave_object wave;
|
wave_object wave;
|
||||||
wt_object wt;
|
wt_object wt;
|
||||||
double *dout,*risk,*dsum;
|
double *dout,*risk,*dsum,*lnoise;
|
||||||
|
|
||||||
wave = wave_init(wname);
|
wave = wave_init(wname);
|
||||||
|
|
||||||
@ -108,10 +137,9 @@ void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,ch
|
|||||||
dwt(wt,signal);
|
dwt(wt,signal);
|
||||||
} else if(!strcmp(method,"swt")) {
|
} else if(!strcmp(method,"swt")) {
|
||||||
swt(wt,signal);
|
swt(wt,signal);
|
||||||
} else if(!strcmp(method,"modwt")) {
|
|
||||||
modwt(wt,signal);
|
|
||||||
} else {
|
} else {
|
||||||
printf("Acceptable WT methods are - dwt,swt and modwt\n");
|
printf("Acceptable WT methods are - dwt and swt\n");
|
||||||
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
len = wt->length[0];
|
len = wt->length[0];
|
||||||
@ -120,9 +148,11 @@ void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,ch
|
|||||||
dout = (double*)malloc(sizeof(double) * dlen);
|
dout = (double*)malloc(sizeof(double) * dlen);
|
||||||
risk = (double*)malloc(sizeof(double) * dlen);
|
risk = (double*)malloc(sizeof(double) * dlen);
|
||||||
dsum = (double*)malloc(sizeof(double) * dlen);
|
dsum = (double*)malloc(sizeof(double) * dlen);
|
||||||
|
lnoise = (double*)malloc(sizeof(double) * J);
|
||||||
|
|
||||||
iter = wt->length[0];
|
iter = wt->length[0];
|
||||||
|
|
||||||
|
if(!strcmp(level,"first")) {
|
||||||
for (i = 1; i < J; ++i) {
|
for (i = 1; i < J; ++i) {
|
||||||
iter += wt->length[i];
|
iter += wt->length[i];
|
||||||
}
|
}
|
||||||
@ -132,10 +162,29 @@ void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,ch
|
|||||||
}
|
}
|
||||||
|
|
||||||
sigma = median(dout,dlen) / 0.6745;
|
sigma = median(dout,dlen) / 0.6745;
|
||||||
|
for(it = 0; it < J;++it) {
|
||||||
|
lnoise[it] = sigma;
|
||||||
|
}
|
||||||
|
} else if(!strcmp(level,"all")){
|
||||||
|
for(it = 0; it < J;++it) {
|
||||||
|
dlen = wt->length[it+1];
|
||||||
|
for(i = 0; i < dlen;++i) {
|
||||||
|
dout[i] = fabs(wt->output[iter+i]);
|
||||||
|
}
|
||||||
|
sigma = median(dout,dlen) / 0.6745;
|
||||||
|
lnoise[it] = sigma;
|
||||||
|
iter += dlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
printf("Acceptable Noise estimation level values are - first and all \n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
for(it = 0; it < J;++it) {
|
for(it = 0; it < J;++it) {
|
||||||
dwt_len = wt->length[it+1];
|
dwt_len = wt->length[it+1];
|
||||||
|
sigma = lnoise[it];
|
||||||
|
|
||||||
if ( sigma < 0.00000001) {
|
if ( sigma < 0.00000001) {
|
||||||
td = 0;
|
td = 0;
|
||||||
@ -202,13 +251,11 @@ void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,ch
|
|||||||
idwt(wt,denoised);
|
idwt(wt,denoised);
|
||||||
} else if(!strcmp(method,"swt")) {
|
} else if(!strcmp(method,"swt")) {
|
||||||
iswt(wt,denoised);
|
iswt(wt,denoised);
|
||||||
} else if(!strcmp(method,"modwt")) {
|
|
||||||
imodwt(wt,denoised);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(dout);
|
free(dout);
|
||||||
free(dsum);
|
free(dsum);
|
||||||
free(risk);
|
free(risk);
|
||||||
|
free(lnoise);
|
||||||
wave_free(wave);
|
wave_free(wave);
|
||||||
wt_free(wt);
|
wt_free(wt);
|
||||||
}
|
}
|
||||||
|
@ -12,9 +12,9 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//depends on J
|
//depends on J
|
||||||
void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,double *denoised);
|
void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,char *level,double *denoised);
|
||||||
|
|
||||||
void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,double *denoised);
|
void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,char *level,double *denoised);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -12,9 +12,9 @@ extern "C" {
|
|||||||
|
|
||||||
//depends on J
|
//depends on J
|
||||||
|
|
||||||
void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,double *denoised);
|
void visushrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,char *level,double *denoised);
|
||||||
|
|
||||||
void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,double *denoised);
|
void sureshrink(double *signal,int N,int J,char *wname,char *method,char *ext,char *thresh,char *level,double *denoised);
|
||||||
|
|
||||||
void getDWTRecCoeff(double *coeff,int *length,char *ctype,char *ext, int level, int J,double *lpr,
|
void getDWTRecCoeff(double *coeff,int *length,char *ctype,char *ext, int level, int J,double *lpr,
|
||||||
double *hpr,int lf,int siglength,double *reccoeff);
|
double *hpr,int lf,int siglength,double *reccoeff);
|
||||||
|
@ -52,10 +52,11 @@ int main() {
|
|||||||
FILE *ifp,*ofp;
|
FILE *ifp,*ofp;
|
||||||
double temp[2400];
|
double temp[2400];
|
||||||
|
|
||||||
char *wname = "sym6";
|
char *wname = "db5";
|
||||||
char *method = "dwt";
|
char *method = "dwt";
|
||||||
char *ext = "sym";
|
char *ext = "sym";
|
||||||
char *thresh = "soft";
|
char *thresh = "soft";
|
||||||
|
char *level = "all";
|
||||||
|
|
||||||
ifp = fopen("pieceregular1024.txt", "r");
|
ifp = fopen("pieceregular1024.txt", "r");
|
||||||
i = 0;
|
i = 0;
|
||||||
@ -72,7 +73,7 @@ int main() {
|
|||||||
fclose(ifp);
|
fclose(ifp);
|
||||||
|
|
||||||
N = i;
|
N = i;
|
||||||
J = 6;
|
J = 4;
|
||||||
|
|
||||||
sig = (double*)malloc(sizeof(double)* N);
|
sig = (double*)malloc(sizeof(double)* N);
|
||||||
inp = (double*)malloc(sizeof(double)* N);
|
inp = (double*)malloc(sizeof(double)* N);
|
||||||
@ -99,8 +100,8 @@ int main() {
|
|||||||
for(i = 0; i < N;++i) {
|
for(i = 0; i < N;++i) {
|
||||||
inp[i] = temp[i];
|
inp[i] = temp[i];
|
||||||
}
|
}
|
||||||
//visushrink(inp,N,J,wname,method,ext,thresh,oup);
|
visushrink(inp,N,J,wname,method,ext,thresh,level,oup);
|
||||||
sureshrink(inp,N,J,wname,method,ext,thresh,oup);
|
//sureshrink(inp,N,J,wname,method,ext,thresh,level,oup);
|
||||||
|
|
||||||
//ofp = fopen("denoiseds.txt", "w");
|
//ofp = fopen("denoiseds.txt", "w");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user