void wlet_int(t_wlet *x, long n) { float f = (float)n; int i = (int)n; if(proxy_getinlet((t_object *)x) == 1){ wlet_setupWavelet(x, gensym((char *)gsl_wavelet_name(x->w_wavelet)), (size_t)n); }else if(proxy_getinlet((t_object *)x) == 2){ if(n > sys_getblksize()){ error("wavelet: size must be smaller than the signal vector %ld", sys_getblksize()); return; } while(i > 1){ f = f / 2.0; if(f - round(f)){ error("wavelet: size must be a multiple of 2"); return; } i = (int)f; } x->w_waveletLength = (int)n; gsl_wavelet_workspace *oldWspace = x->w_workspace; x->w_workspace = gsl_wavelet_workspace_alloc((size_t)n); gsl_wavelet_workspace_free(oldWspace); double *oldTmp = x->w_tmp; x->w_tmp = (double *)calloc((int)n, sizeof(double)); free(oldTmp); }//else if(proxy_getinlet((t_object *)x) == 3){ // x->w_stride = (size_t)n; //} }
void wlet_free(t_wlet *x) { dsp_free((t_pxobject *)x); free(x->w_tmp); gsl_wavelet_free(x->w_wavelet); gsl_wavelet_workspace_free(x->w_workspace); }
/** \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; }
static void PyGSL_transform_space_dealloc(PyGSL_transform_space * self) { FUNC_MESS_BEGIN(); assert(PyGSL_transform_space_check(self)); assert(self->space.v); switch(self->type){ case COMPLEX_WORKSPACE: gsl_fft_complex_workspace_free(self->space.cws); break; case COMPLEX_WAVETABLE: gsl_fft_complex_wavetable_free(self->space.cwt); break; case REAL_WORKSPACE: gsl_fft_real_workspace_free(self->space.rws); break; case REAL_WAVETABLE: gsl_fft_real_wavetable_free(self->space.rwt); break; case HALFCOMPLEX_WAVETABLE: gsl_fft_halfcomplex_wavetable_free(self->space.hcwt); break; case COMPLEX_WORKSPACE_FLOAT: gsl_fft_complex_workspace_float_free(self->space.cwsf); break; case COMPLEX_WAVETABLE_FLOAT: gsl_fft_complex_wavetable_float_free(self->space.cwtf); break; case REAL_WORKSPACE_FLOAT: gsl_fft_real_workspace_float_free(self->space.rwsf); break; case REAL_WAVETABLE_FLOAT: gsl_fft_real_wavetable_float_free(self->space.rwtf); break; case HALFCOMPLEX_WAVETABLE_FLOAT: gsl_fft_halfcomplex_wavetable_float_free(self->space.hcwtf); break; #ifdef _PYGSL_GSL_HAS_WAVELET case WAVELET_WORKSPACE : gsl_wavelet_workspace_free(self->space.wws); break; #endif default: pygsl_error("Got unknown switch", filename, __LINE__, GSL_ESANITY); break; } self->space.v = NULL; FUNC_MESS_END(); }
void dwt2d_forward_haar(double *data,int n,int ns) { gsl_wavelet_workspace *work; gsl_wavelet *w; gsl_matrix *m1; gsl_matrix_view m; int i,j; long dims[3]={2,n,n}; double *res = ypush_d(dims); int k=0; for (i=0;i<n;i++) { for (j=0;j<n;j++) { k = j+i*n; res[k] = data[k]; } } w = gsl_wavelet_alloc(gsl_wavelet_haar, 2); work = gsl_wavelet_workspace_alloc(n*n); if (ns == 1) gsl_wavelet2d_nstransform_forward(w, res, n, n, n,work); else gsl_wavelet2d_transform_forward(w, res, n, n, n,work); gsl_wavelet_workspace_free (work); gsl_wavelet_free (w); }
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; }
void dwt2d_filt_daub(double *data, long *mask, int order,int n,int ns) { gsl_wavelet_workspace *work; gsl_wavelet *w; gsl_matrix *m1; gsl_matrix_view m; int i,j; long dims[3]={2,n,n}; double *res = ypush_d(dims); int k=0; for (i=0;i<n;i++) { for (j=0;j<n;j++) { k = j+i*n; res[k] = data[k]; } } w = gsl_wavelet_alloc(gsl_wavelet_daubechies, order); work = gsl_wavelet_workspace_alloc(n*n); if (ns == 1) gsl_wavelet2d_nstransform_forward(w, res, n, n, n,work); else gsl_wavelet2d_transform_forward(w, res, n, n, n,work); k=0; for (i=0;i<n;i++) { for (j=0;j<n;j++) { k = j+i*n; res[k] *= (double)mask[k]; } } if (ns == 1) gsl_wavelet2d_nstransform_inverse(w, res, n, n, n,work); else gsl_wavelet2d_transform_inverse(w, res, n, n, n,work); gsl_wavelet_workspace_free (work); gsl_wavelet_free (w); }