コード例 #1
0
ファイル: waly.c プロジェクト: dgratadour/waly
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);

}
コード例 #2
0
ファイル: waly.c プロジェクト: dgratadour/waly
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);

}
コード例 #3
0
static GstFlowReturn
gst_dwt_filter_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
{
	GstDwtFilter *filter;
	GstMapInfo info;
	int i, j;
	struct timespec t1, t2, diff;

	filter = GST_DWTFILTER (parent);

	gst_buffer_map (buf, &info, GST_MAP_WRITE);
	guint8_to_gdouble(info.data, filter->pDWTBuffer, filter->height * filter->width);

	clock_gettime(CLOCK_REALTIME, &t1);

	gsl_wavelet2d_transform_forward(filter->w,
									filter->pDWTBuffer,
									filter->width,
									filter->width,
									filter->height,
									filter->work);
	
	memcpy(filter->pTmpBuffer, filter->pDWTBuffer, filter->width * filter->height * sizeof(double));

	if(filter->band == GST_DWTFILTER_HIGHPASS)
	{
		for(j = 0; j < filter->cutoff; j++)
		{
			memset(filter->pDWTBuffer + j * filter->width, 0, sizeof(gdouble) * filter->cutoff);
		}
	}
	else
	{
		for(j = 0; j < filter->cutoff; j++)
		{
			memset(filter->pDWTBuffer + j * filter->width + filter->cutoff, 0,
				sizeof(gdouble) * (filter->width - filter->cutoff));
		}
		for(; j < filter->height; j++)
		{
			memset(filter->pDWTBuffer + j * filter->width, 0, sizeof(gdouble) * filter->width);
		}
	}
	
	if(filter->phof)
	{
		memcpy(filter->pTmpBuffer2, filter->pDWTBuffer, filter->width * filter->height * sizeof(double));

//		higher_detail_window.x = higher_detail_window.y = 100;
//		higher_detail_window.width = higher_detail_window.height = 100;

		copy_higher_details(filter->pTmpBuffer2,
				filter->pTmpBuffer,
				filter->width,
				filter->height,
				filter->phof_window.x,
				filter->phof_window.y,
				filter->phof_window.w,
				filter->phof_window.h);
	}

	if(filter->inverse == TRUE)
	{
//		memset(filter->pDWTBuffer, 0, filter->width * filter->height * sizeof(double));
//		filter->pDWTBuffer[0] = 23763.375000;
////		filter->pDWTBuffer[1] = -215.941406;
////		filter->pDWTBuffer[2 * filter->width + 0] = -2202.557521;
//		filter->pDWTBuffer[filter->width] = 2489.681545;
//		for(i = filter->width + 0; i <= filter->width + 0; i++)
//		{
//			g_print("filter->pDWTBuffer[%d] = %lf\n", i, filter->pDWTBuffer[i]);
//		}
//		g_print("filter->pDWTBuffer[1] = %lf\n", filter->pDWTBuffer[1]);

		gsl_wavelet2d_transform_inverse(filter->w,
										filter->pDWTBuffer,
										filter->width,
										filter->width,
										filter->height,
										filter->work);

		if(filter->phof)
		{
			gsl_wavelet2d_transform_inverse(filter->w,
											filter->pTmpBuffer2,
											filter->width,
											filter->width,
											filter->height,
											filter->work);

			for(i = filter->phof_window.x; i < filter->phof_window.x + filter->phof_window.w; i++)
			{
				for(j = filter->phof_window.y; j < filter->phof_window.y + filter->phof_window.h; j++)
				{
					int ix = i + j * filter->width;
					filter->pDWTBuffer[ix] = filter->pTmpBuffer2[ix];
				}
			}
		}
	}
	else
	{
		if(filter->phof)
		{
			memcpy(filter->pDWTBuffer, filter->pTmpBuffer2, filter->width * filter->height * sizeof(double));
		}
	}

	clock_gettime(CLOCK_REALTIME, &t2);

	gdouble_to_guint8(filter->pDWTBuffer, info.data, filter->height * filter->width);

	if(filter->phof)
	{
		memset(info.data + filter->phof_window.x + filter->phof_window.y * filter->width,
				255,
				filter->phof_window.w);
		memset(info.data + filter->phof_window.x + (filter->phof_window.y + filter->phof_window.w )* filter->width,
				255,
				filter->phof_window.w);

		for(i = filter->phof_window.y; i < filter->phof_window.y + filter->phof_window.h; i++)
		{
			info.data[filter->phof_window.x + i * filter->width] = 255;
			info.data[filter->phof_window.x + filter->phof_window.w + i * filter->width] = 255;
		}
	}

	gst_buffer_unmap (buf, &info);

	if(t2.tv_nsec >= t1.tv_nsec)
	{
		diff.tv_sec = t2.tv_sec - t1.tv_sec;
		diff.tv_nsec = t2.tv_nsec - t1.tv_nsec;
	}
	else
	{
		diff.tv_sec = t2.tv_sec - t1.tv_sec - 1;
		diff.tv_nsec = 1000000000 + t2.tv_nsec - t1.tv_nsec;
	}

	return gst_pad_push (filter->srcpad, buf);
}
コード例 #4
0
ファイル: wavelet2d.hpp プロジェクト: Bhare8972/RFD_modelling
    /**
     * C++ version of gsl_wavelet2d_transform_forward().
     * @param data Data array
     * @param tda Physical row length
     * @param size1 Number of rows
     * @param size2 Number of columns
     * @param work Supply a workspace of appropriate (undocumented) size
     * @return Error code on failure
     */
    int transform_forward( double* data, size_t tda, size_t size1, size_t size2,
			   wavelet::workspace& work ) const {
      return gsl_wavelet2d_transform_forward( get(), data, tda, size1, size2, work.get() ); }