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; }
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); }
/** * The assignment operator. This copies elementwise. * @param v The wavelet2d to copy */ wavelet2d& operator=( wavelet2d const& v ){ // first, possibly delete anything pointed to by this if( count == 0 or --*count == 0 ){ if( ccgsl_pointer != 0 ) gsl_wavelet_free( ccgsl_pointer ); delete count; } // Then copy ccgsl_pointer = v.ccgsl_pointer; count = v.count; if( count != 0 ) ++*count; return *this; }
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); }
void wlet_setupWavelet(t_wlet *x, t_symbol *msg, size_t k) { gsl_wavelet *oldWlet = x->w_wavelet; x->w_k = k; if(!strcmp(msg->s_name, "daubechies")){ if(k = -1) k = 4; if(k < 4 || k > 20 || ((k / 2) - round(k / 2))){ error("wavelet: k must equal 4, 6, 8, 10, 12, 14, 16, 18, or 20. Defaulting to k = 4."); k = 4; } x->w_waveletType = (gsl_wavelet_type *)gsl_wavelet_daubechies; x->w_wavelet = gsl_wavelet_alloc(gsl_wavelet_daubechies, k); }else if(!strcmp(msg->s_name, "daubechies_centered") || !strcmp(msg->s_name, "daubechies-centered")){ if(k = -1) k = 4; if(k < 4 || k > 20 || ((k / 2) - round(k / 2))){ error("wavelet: k must equal 4, 6, 8, 10, 12, 14, 16, 18, or 20. Defaulting to k = 4."); k = 4; } x->w_waveletType = (gsl_wavelet_type *)gsl_wavelet_daubechies_centered; x->w_wavelet = gsl_wavelet_alloc(gsl_wavelet_daubechies_centered, k); }else if(!strcmp(msg->s_name, "haar")){ if(k = -1) k = 2; if(k != 2){ error("wavelet: k must equal 2. Defaulting to k = 2."); k = 2; } x->w_waveletType = (gsl_wavelet_type *)gsl_wavelet_haar; x->w_wavelet = gsl_wavelet_alloc(gsl_wavelet_haar, k); }else if(!strcmp(msg->s_name, "haar_centered") || !strcmp(msg->s_name, "haar-centered")){ if(k = -1) k = 2; if(k != 2){ error("wavelet: k must equal 2. Defaulting to k = 2."); k = 2; } x->w_waveletType = (gsl_wavelet_type *)gsl_wavelet_haar_centered; x->w_wavelet = gsl_wavelet_alloc(gsl_wavelet_haar_centered, k); }else if(!strcmp(msg->s_name, "bspline")){ if(k = -1) k = 103; if(k != 103 && k != 105 && k != 202 && k != 204 && k != 206 && k != 208 && k != 301 && k != 303 && k != 305 && k != 307 && k != 309){ error("wavelet: k must equal 103, 105, 202, 204, 206, 208, 301, 303, 305 307, or 309. Defaulting to k = 103."); k = 103; } x->w_waveletType = (gsl_wavelet_type *)gsl_wavelet_bspline; x->w_wavelet = gsl_wavelet_alloc(gsl_wavelet_bspline, k); }else if(!strcmp(msg->s_name, "bspline_centered") || !strcmp(msg->s_name, "bspline-centered")){ if(k = -1) k = 103; if(k != 103 && k != 105 && k != 202 && k != 204 && k != 206 && k != 208 && k != 301 && k != 303 && k != 305 && k != 307 && k != 309){ error("wavelet: k must equal 103, 105, 202, 204, 206, 208, 301, 303, 305 307, or 309. Defaulting to k = 103."); k = 103; } x->w_waveletType = (gsl_wavelet_type *)gsl_wavelet_bspline_centered; x->w_wavelet = gsl_wavelet_alloc(gsl_wavelet_bspline_centered, k); }else{ error("wavelet: wavelet of type %s not implemented", msg->s_name); return; } gsl_wavelet_free(oldWlet); }
static PyObject *uwt_uwt(PyObject *self, PyObject *args, PyObject *keywds) { PyObject *x = NULL; PyObject *xa = NULL; PyObject *Xa = NULL; int levels = 0; char wf; int i, k, j, n, J; double *_x; double *_X; double *v; double *wj, *vj; double *h, *g; npy_intp Xa_dims[2]; gsl_wavelet *wave; /* Parse Tuple*/ static char *kwlist[] = {"x", "wf", "k", "levels", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "Oci|i", kwlist, &x, &wf, &k, &levels)) return NULL; xa = PyArray_FROM_OTF(x, NPY_DOUBLE, NPY_IN_ARRAY); if (xa == NULL) return NULL; n = (int) PyArray_DIM(xa, 0); _x = (double *) PyArray_DATA(xa); switch (wf) { case 'd': wave = gsl_wavelet_alloc (gsl_wavelet_daubechies_centered, k); break; case 'h': wave = gsl_wavelet_alloc (gsl_wavelet_haar_centered, k); break; case 'b': wave = gsl_wavelet_alloc (gsl_wavelet_bspline_centered, k); break; default: PyErr_SetString(PyExc_ValueError, "wavelet family is not valid"); return NULL; } h = (double *) malloc(wave->nc * sizeof(double)); g = (double *) malloc(wave->nc * sizeof(double)); for(i=0; i<wave->nc; i++) { h[i] = wave->h1[i] / SQRT_2; g[i] = wave->g1[i] / SQRT_2; } if (levels == 0) J = (int) floor(log(((n-1) / (wave->nc-1)) + 1) / log(2)); else J = levels; Xa_dims[0] = (npy_intp) (2 * J); Xa_dims[1] = PyArray_DIM(xa, 0); Xa = PyArray_SimpleNew(2, Xa_dims, NPY_DOUBLE); _X = (double *) PyArray_DATA(Xa); v = _x; for(j=0; j<J; j++) { wj = _X +(j * n); vj = _X +((j + J) * n); uwt_forward(v, n, j+1, g, h, wave->nc, wj, vj); v = vj; } gsl_wavelet_free(wave); free(h); free(g); Py_DECREF(xa); return Py_BuildValue("N", Xa); }
static PyObject *uwt_iuwt(PyObject *self, PyObject *args, PyObject *keywds) { PyObject *X = NULL; PyObject *Xa = NULL; PyObject *xa = NULL; char wf; int i, k, n, J; double *w1, *v1; double *_X; double *_x; double *h, *g; npy_intp xa_dims[1]; gsl_wavelet *wave; /* Parse Tuple*/ static char *kwlist[] = {"X", "wf", "k", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "Oci", kwlist, &X, &wf, &k)) return NULL; Xa = PyArray_FROM_OTF(X, NPY_DOUBLE, NPY_IN_ARRAY); if (Xa == NULL) return NULL; n = (int) PyArray_DIM(Xa, 1); J = ((int) PyArray_DIM(Xa, 0)) / 2; _X = (double *) PyArray_DATA(Xa); switch (wf) { case 'd': wave = gsl_wavelet_alloc (gsl_wavelet_daubechies, k); break; case 'h': wave = gsl_wavelet_alloc (gsl_wavelet_haar, k); break; case 'b': wave = gsl_wavelet_alloc (gsl_wavelet_bspline, k); break; default: PyErr_SetString(PyExc_ValueError, "wavelet family is not valid"); return NULL; } h = (double *) malloc(wave->nc * sizeof(double)); g = (double *) malloc(wave->nc * sizeof(double)); for(i=0; i<wave->nc; i++) { h[i] = wave->h2[i] / SQRT_2; g[i] = wave->g2[i] / SQRT_2; } w1 = _X; v1 = _X + (J * n); xa_dims[0] = (npy_intp) n; xa = PyArray_SimpleNew(1, xa_dims, NPY_DOUBLE); _x = (double *) PyArray_DATA(xa); uwt_backward (w1, v1, 1, n, g, h, wave->nc, _x); gsl_wavelet_free(wave); free(h); free(g); Py_DECREF(Xa); return Py_BuildValue("N", xa); }