Beispiel #1
0
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);
}
Beispiel #2
0
/** \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;
}
Beispiel #3
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);

}
Beispiel #4
0
    /**
     * 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;
    }
Beispiel #5
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;
}
Beispiel #6
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);

}
Beispiel #7
0
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);
}
Beispiel #8
0
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);
}
Beispiel #9
0
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);
}