/** \brief Generic Wavelet-Denoising. \ingroup grpwavelet compute DWT of signal, call the thresholding function 'threshfct' for each resolution level and IDWT the signal */ int wavelet_denoise ( double *data, int n, WaveletParameters P ){ gsl_wavelet *w; gsl_wavelet_workspace *work; int j, J, k, offset; double lambda; /* population sd, threshold */ dprintf("Db: generic_denoising\n"); w = gsl_wavelet_alloc( P.wavelet, P.vanishing_moments ); work = gsl_wavelet_workspace_alloc( n ); gsl_wavelet_transform_forward( w, data, 1, n, work ); /* -- thresholding here -- */ J = (int)round(glog((double)n, 2)); for(j=P.first_thresholding_level; j<J; j++){ /* loop through levels */ offset = (int)pow(2, j); lambda = (*(P.threshselfct))(&(data[offset]), offset); for(k=offset; k<2*offset; k++){ /* loop through coefficients */ /* soft or hard thresholding */ data[k]=(*(P.threshfct))(data[k], lambda); } } /* -- thresholding end -- */ gsl_wavelet_transform_inverse(w, data, 1, n, work); gsl_wavelet_free(w); gsl_wavelet_workspace_free(work); return 0; }
int main (int argc, char **argv) { (void)(argc); /* avoid unused parameter warning */ int i, n = 256, nc = 20; double *data = malloc (n * sizeof (double)); double *abscoeff = malloc (n * sizeof (double)); size_t *p = malloc (n * sizeof (size_t)); FILE * f; gsl_wavelet *w; gsl_wavelet_workspace *work; w = gsl_wavelet_alloc (gsl_wavelet_daubechies, 4); work = gsl_wavelet_workspace_alloc (n); f = fopen (argv[1], "r"); for (i = 0; i < n; i++) { fscanf (f, "%lg", &data[i]); } fclose (f); gsl_wavelet_transform_forward (w, data, 1, n, work); for (i = 0; i < n; i++) { abscoeff[i] = fabs (data[i]); } gsl_sort_index (p, abscoeff, 1, n); for (i = 0; (i + nc) < n; i++) data[p[i]] = 0; gsl_wavelet_transform_inverse (w, data, 1, n, work); for (i = 0; i < n; i++) { printf ("%g\n", data[i]); } gsl_wavelet_free (w); gsl_wavelet_workspace_free (work); free (data); free (abscoeff); free (p); return 0; }