From cb01ae39ec25b8ce917df5456d46de403ed17679 Mon Sep 17 00:00:00 2001 From: Rafat Hussain Date: Tue, 8 Aug 2017 18:20:20 +0530 Subject: [PATCH] commit : sureshrink init --- denoise/denoise.c | 127 +++++++++++++++++++++++++++++++++++++++++++++- denoise/denoise.h | 3 ++ 2 files changed, 129 insertions(+), 1 deletion(-) diff --git a/denoise/denoise.c b/denoise/denoise.c index b7d4827..b57a929 100644 --- a/denoise/denoise.c +++ b/denoise/denoise.c @@ -41,6 +41,23 @@ double mad(double *x, int N) { return sigma; } +int minindex(double *arr, int N) { + double min; + int index,i; + + min = DBL_MAX; + index = 0; + for(i = 0; i < N;++i) { + if (arr[i] < min) { + min = arr[i]; + index = i; + } + } + + return index; + +} + void getDWTAppx(wt_object wt, double *appx,int N) { /* Wavelet decomposition is stored as @@ -89,6 +106,7 @@ void visushrink(double *signal,int N,char *wname,char *method,char *ext,char *th double sigma,td,tmp; wave_object wave; wt_object wt; + double *dout; wave = wave_init(wname); @@ -110,11 +128,17 @@ void visushrink(double *signal,int N,char *wname,char *method,char *ext,char *th iter = wt->length[0]; dlen = wt->length[J]; + dout = (double*)malloc(sizeof(double) * dlen); + for (i = 1; i < J; ++i) { iter += wt->length[i]; } - sigma = mad(wt->output+iter,dlen); + for(i = 0; i < dlen;++i) { + dout[i] = wt->output[iter+i]; + } + + sigma = mad(dout,dlen); dwt_len = wt->outlength; td = sqrt(2.0 * log(dwt_len)) * sigma / 0.6745; @@ -139,6 +163,107 @@ void visushrink(double *signal,int N,char *wname,char *method,char *ext,char *th idwt(wt,denoised); + free(dout); + wave_free(wave); + wt_free(wt); +} + +void sureshrink(double *signal,int N,char *wname,char *method,char *ext,char *thresh,double *denoised) { + int J, filt_len,i,it,len,dlen,dwt_len,min_index,sgn; + double sigma,norm,td,tv,te,ct,thr,temp,x_sum; + wave_object wave; + wt_object wt; + double *dout,*risk; + + wave = wave_init(wname); + + filt_len = wave->filtlength; + + J = (int) (log((double)N / ((double)filt_len - 1.0)) / log(2.0)); + + if (J > 50) { + J = 50; + } + + wt = wt_init(wave,method,N,J); + setDWTExtension(wt,ext); + + dwt(wt,signal); + + len = wt->length[0]; + dlen = wt->length[J]; + + dout = (double*)malloc(sizeof(double) * dlen); + risk = (double*)malloc(sizeof(double) * dlen); + + for(it = 0; it < J;++it) { + dwt_len = wt->length[it+1]; + + for(i = 0; i < dlen;++i) { + dout[i] = wt->output[len+i]; + } + + sigma = mad(dout,dwt_len); + + if ( sigma < 0.00000001) { + td = 0; + } else { + tv = sqrt(2.0 * log(dwt_len)); + norm = 0.0; + for(i = 0; i < dwt_len;++i) { + norm += (wt->output[len+i] *wt->output[len+i]); + } + te =(norm - (double) dwt_len)/(double) dwt_len; + ct = pow(log((double) dwt_len)/log(2.0),1.5)/sqrt((double) dwt_len); + + if (te < ct) { + td = tv; + } else { + x_sum = 0.0; + for(i = 0; i < dwt_len;++i) { + dout[i] = (dout[i]*dout[i]); + x_sum += dout[i]; + } + + for(i = 0;i < dwt_len;++i) { + risk[i] = ((double)dwt_len + 1 - 2 * ((double)i + 1) +x_sum + + dout[i]*((double)dwt_len - 1 -(double) i))/(double)dwt_len; + } + + min_index = minindex(risk,dwt_len); + thr = sqrt(dout[min_index]); + + td = thr < tv ? thr : tv; + } + } + + td = td * sigma / 0.6745; + + if(!strcmp(thresh,"hard")) { + for(i = 0; i < dwt_len;++i) { + if (fabs(wt->output[len+i]) < td) { + wt->output[i] = 0; + } + } + } else if(!strcmp(thresh,"soft")) { + for(i = 0; i < dwt_len;++i) { + if (fabs(wt->output[len + i]) < td) { + wt->output[i] = 0; + } else { + sgn = wt->output[len+i] >= 0 ? 1 : -1; + temp = sgn * (fabs(wt->output[len+i]) - td); + wt->output[i] = temp; + } + } + } + + len += wt->length[it+1]; + } + + idwt(wt,denoised); + + free(dout); + free(risk); wave_free(wave); wt_free(wt); } diff --git a/denoise/denoise.h b/denoise/denoise.h index c50298d..2d1809e 100644 --- a/denoise/denoise.h +++ b/denoise/denoise.h @@ -7,6 +7,7 @@ Copyright (c) 2017, Rafat Hussain #include #include #include +#include #include #include "../header/wavelib.h" @@ -17,6 +18,8 @@ extern "C" { void visushrink(double *signal,int N,char *wname,char *method,char *ext,char *thresh,double *denoised); +void sureshrink(double *signal,int N,char *wname,char *method,char *ext,char *thresh,double *denoised); + double mad(double *x, int N);