⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lifting53.cpp

📁 双正交5/3小波的提升格式构造
💻 CPP
字号:
/*
  this program performs 1D and 2D wavelet decomposition 
  and synthesis using lifting algorithm. the wavelet used
  here is a set of invertible wavelet that map integer to
  integer, namely 5/3 wavelet.

  forward transformation:
  d[n] = d_0[n] - \leftfloor 1/2 (s_0[n+1] + s_0[n]) \rightfloor
  s[n] = s_0[n] + \leftfloor 1/4 (d[n] + d[n-1]) + 1/2 \rightfloor

  written by Y.B. Mao at Dept. of Automation, NJUST
  Oct. 23, 2005
  Version 1.0

  All rights reserved.  
*/
# include <stdlib.h>
# include <stdio.h>
# include <malloc.h>
# include "lifting53.h"

/*
 one round 5/3 wavelet decomposition using lifting
*/
int wavelet_analysis( int * data, int n,   // original data
				      int * approximation, // approximation coefficients
				      int * detail )       // detail coefficients
{
	int m, i;
	int * x, * d;
	
	m = n/2;
	n = m * 2;  /* n must be even */

	x = ( int * ) malloc( sizeof(int) * (n+3) );
	d = ( int * ) malloc( sizeof(int) * (m+1) );

	for ( i = 0; i < n; i++ ) /* boundary extension, CB ABCDEF E */
	{
		x[i+2] = data[i];
	}
	x[0] = data[2];
	x[1] = data[1];
	x[n+2] = data[n-2];
	/* detail (odd) */
	for ( i = 0; i <= m; i++ )
	{
		d[i] = x[i*2+1] - (x[i*2]+x[i*2+2])/2;
	}
	for ( i = 0; i < m; i++ )
		detail[i] = d[i+1];
	/* approximation (even) */
	for ( i = 0; i < m; i++ )
	{
		approximation[i] = x[2*i+2] + ( d[i+1]+d[i]+2 )/4;
	}

	free( x );
	free( d );

	return( m );
}

/*
 one round wavelet synthesis
*/
int wavelet_synthesis( int * approximation, // approximation coefficients
				       int * detail,        // detail coefficients
					   int n,               // n is length of both detail and approximation
				       int * data )         // synthesised data
{
	int * s, * d, * x;
	int i, m;

	m = n * 2;
	s = (int *) malloc( sizeof(int) * (n+1) );
	d = (int *) malloc( sizeof(int) * (n+2) );
	x = (int *) malloc( sizeof(int) * (m+1) );

	/* boundary extension */
	for ( i = 0; i < n; i++ ) s[i] = approximation[i];
	s[n] = approximation[n-1]; /* right extension, ...EF F */
	for ( i = 0; i < n; i++ ) d[i+1] = detail[i];
	d[0] = detail[0];  /* left extension, A ABC ... */
	d[n+1] = detail[n-2]; /* right extension, ... DEF E */
	/* lifting */
	for ( i = 0; i < n+1; i++ )
		x[i*2] = s[i]-(d[i]+d[i+1]+2)/4;
	for ( i = 0; i < n; i++ )
		x[i*2+1] = d[i+1] + (x[i*2]+x[i*2+2])/2;
	/* copy x to data */
	for ( i = 0; i < m; i++ )
		data[i] = x[i];

	free( x );
	free( s );
	free( d );

	return( m );
}

/*
 multi-level decomposition for 1D signal
*/
int multilevel_decomposition_1D( int * original, // original signal
								 int n,             // number of pointers, should be multiple of 2
								 int * resultdata,    // decomposited data
								 int levels )       // decomposition levels  
{
	int i, x, nn;
	int rtv;
	int * l, * h, * data;

	nn = (n>>levels)<<levels; // guartee nn to be multiple of 2
	for ( x = nn; x < n; x++ ) resultdata[x] = 0;
	l = new int[n];
	h = new int[n];
	data = new int[n];
	for ( x = 0; x < nn; x++ ) l[x] = original[x];
	for ( i = 0; i < levels; i++ )
	{
		for ( x = 0; x < nn; x++ ) data[x] = l[x];
		rtv = wavelet_analysis( data, nn, l, h );
		nn = nn/2;
		for ( x = 0; x < nn; x++ ) resultdata[x] = l[x];
		for ( x = 0; x < nn; x++ ) resultdata[nn+x] = h[x];
	}
	delete[] l;
	delete[] h;
	delete[] data;

	return( nn ); // return total points subject to decomposition
}

/*
 multi-level reconstruction for 1D signal
*/
int multilevel_reconstruction_1D( int * de_data, // deconstructed signal
								  int n,             // number of pointers, should be multiple of 2
								  int * resultdata,    // reconstructed data
								  int levels )       // reconstruct levels  
{
	int i, x, nn;
	int rtv;
	int * l, * h, * data;

	nn = n>>levels;
	l = new int[n];
	h = new int[n];
	data = new int[n];
	for ( x = 0; x < n; x++ ) data[x] = de_data[x];
	for ( i = 0; i < levels; i++ )
	{
		for ( x = 0; x < nn; x++ ) l[x] = data[x];
		for ( x = 0; x < nn; x++ ) h[x] = data[nn+x];
		rtv = wavelet_synthesis( l, h, nn, data );
		nn = nn*2;
	}
	for ( x = 0; x < n; x++ ) resultdata[x] = data[x];
	delete[] l;
	delete[] h;
	delete[] data;

	return( nn ); // return total points subject to decomposition
}

/*
 multi-level decomposition for 2D signal
*/
int multilevel_decomposition_2D( int * image,         // original signal
								 int width, int height,  // number of pointers, should be multiple of 2
								 int * wavelet_data,  // decomposited data
								 int levels )            // decomposition levels  
{
	int i, x, y, ww, hh;
	int rtv;
	int * l, * h, * data;

	ww = ( width>>levels )<<levels; // guartee nn to be multiple of 2
	hh = ( height>>levels )<<levels;

	for ( y = 0; y < height; y++ )
		for ( x = 0; x < width; x++ )
			wavelet_data[y*width+x] = image[y*width+x];

	for ( i = 0; i < levels; i++ )
	{
		for ( y = 0; y < hh; y++ )
		{
			l = new int[ww];
			h = new int[ww];
			data = new int[ww];
			for ( x = 0; x < ww; x++ ) data[x] = wavelet_data[ y*width+x ];
			rtv = wavelet_analysis( data, ww, l, h );
			for ( x = 0; x < ww/2; x++ ) wavelet_data[y*width+x] = l[x];
			for ( x = 0; x < ww/2; x++ ) wavelet_data[y*width+x+ww/2] = h[x];
			delete[] l;
			delete[] h;
			delete[] data;
		}
		for ( x = 0; x < ww; x++ )
		{
			l = new int[hh];
			h = new int[hh];
			data = new int[hh];
			for ( y = 0; y < hh; y++ ) data[y] = wavelet_data[ y*width+x ];
			rtv = wavelet_analysis( data, hh, l, h );
			for ( y = 0; y < hh/2; y++ ) wavelet_data[y*width+x] = l[y];
			for ( y = 0; y < hh/2; y++ ) wavelet_data[(y+hh/2)*width+x] = h[y];
			delete[] l;
			delete[] h;
			delete[] data;
		}
		ww = ww/2;
		hh = hh/2;
	}

	return( levels ); // return decomposition levels
}

/*
 multi-level reconstruction for 2D signal
*/
int multilevel_reconstruction_2D( int * wavelet_data,  // wavelet coefficients
								  int width, int height,  // number of pointers, should be multiple of 2
								  int * image,         // reconstructed data
								  int levels )            // reconstruction levels
{
	int i, x, y, ww, hh;
	int rtv;
	int * l, * h, * data;

	ww = width>>levels;  // guartee nn to be multiple of 2
	hh = height>>levels;

	for ( y = 0; y < height; y++ )
		for ( x = 0; x < width; x++ )
			image[y*width+x] = wavelet_data[y*width+x];

	for ( i = 0; i < levels; i++ )
	{

		for ( x = 0; x < ww*2; x++ )
		{
			l = new int[hh];
			h = new int[hh];
			data = new int[hh*2];
			for ( y = 0; y < hh; y++ ) 
			{
				l[y] = image[ y*width+x ];
				h[y] = image[ (y+hh)*width+x ];
			}
			rtv = wavelet_synthesis( l, h, hh, data );
			for ( y = 0; y < hh*2; y++ ) image[y*width+x] = data[y];
			delete[] l;
			delete[] h;
			delete[] data;
		}
		for ( y = 0; y < hh*2; y++ )
		{
			l = new int[ww];
			h = new int[ww];
			data = new int[ww*2];
			for ( x = 0; x < ww; x++ )
			{
				l[x] = image[ y*width+x ];
				h[x] = image[ y*width+x+ww ];
			}
			rtv = wavelet_synthesis( l, h, ww, data );
			for ( x = 0; x < ww*2; x++ ) image[y*width+x] = data[x];
			delete[] l;
			delete[] h;
			delete[] data;
		}
		ww = ww*2;
		hh = hh*2;
	}

	return( levels ); // return decomposition levels
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -