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); }
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); }
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); }
/** * 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() ); }