www.pudn.com > wavecode.rar > f97.c


#include  
#include  
#include  
#include  
#include  
#include  
 
#define F_EXTPAD 4 
#define D_EXTPAD 2 
 
static int *x_alloc = NULL;	//** temp work 
 
void forwardf97(int *x_in, int N) 
{ 
int i, n, half; 
int *x,*r,*d; 
 
	x = x_alloc + F_EXTPAD; 
	memcpy(x,x_in,sizeof(int)*N); 
	for(i=1;i<=F_EXTPAD;i++) { 
		x[-i] = x[i]; 
		x[(N-1) + i] = x[(N-1) - i]; 
	} 
 
	half = N>>1;   
 
	r = x_in; d = x_in + half; 
	for (n=half;n--;) { 
 
		*r++ = 0.0378285 * (x[ 4] + x[-4]) - 0.0238495 * (x[ 3] + x[-3]) - 0.110624 * (x[ 2] + x[-2]) +  
					0.377403 * (x[ 1] + x[-1]) + 0.852699 * x[0]; 
 
		x++; 
 
		*d++ =  - 0.064539 * (x[ 3] + x[-3]) + 0.040689 * (x[ 2] + x[-2]) +  
				0.418092 * (x[ 1] + x[-1]) - 0.788486 * x[ 0] ; 
 
		x++; 
    } 
} 
 
void inversef97(int *x, int N) 
{ 
int i, n, half; 
int *r, *d; 
 
	half = N/2; 
 
	r = x_alloc + D_EXTPAD;   
	d = x_alloc + D_EXTPAD + half+D_EXTPAD+D_EXTPAD;   
	memcpy(r,x,half*sizeof(int)); 
	memcpy(d,x+half,half*sizeof(int)); 
 
	for(i=1;i<=D_EXTPAD;i++) { 
		r[-i] = r[i]; 
		r[(half-1)+i] = r[half - i]; 
		d[-i] = d[i-1]; 
		d[(half-1)+i] = d[(half-1) - i]; 
	} 
  
	for (n = half; n--;) { 
 
		*x++ = 0.788486 * r[0] - 0.0406894 * ( r[1] + r[-1] ) 
		     - 0.023849 * (d[1] + d[-2]) + 0.377403 * (d[0] + d[-1]); 
 
		*x++ = 0.418092 * (r[1] + r[0]) - 0.0645389 * (r[2] + r[-1]) 
		     - 0.037829 * (d[2] + d[-2]) + 0.110624 * (d[1] + d[-1]) - 0.852699 * d[0]; 
 
		d++; r++; 
	} 
} 
 
void f97_2D(int **rows, int width, int height, int levels,bool inverse) 
{ 
int x, y, w, yw, h, l; 
int *buffer,*rows_ptr; 
 
    /* Check the dimensions for compatability. */ 
 
    if (width%(1 << levels) || height%(1 << levels)) { 
		errputs("width and height must be divisible by 2^levels"); 
		exit(10); 
	} 
 
	if ( (x_alloc = malloc(sizeof(int)*(width+height+F_EXTPAD+F_EXTPAD))) == NULL )  { 
		errputs("malloc failed"); exit(10); 
	} 
   
    /* Allocate a work array (for transposing columns) */ 
     
   	if ( (buffer = newarray(int,height)) == NULL ) { 
		errputs("malloc failed"); exit(10); 
	} 
 
    /* Compute the rowslet transform. */ 
   
	if ( !inverse ) { /* forward transform. */ 
 
		for (l = 0; l < levels; l++) { 
			w = width >> l; 
			h = height >> l; 
       
			/* Rows. */ 
	 
			for (y = 0; y < h; y++) 
				forwardf97(rows[y], w); 
     
			/* Columns. */ 
	 
			rows_ptr = rows[0]; 
			for (x = 0; x < w; x++) { 
				for (y = 0,yw=0; y < h; y++,yw+=width) buffer[y] = rows_ptr[yw]; 
				forwardf97(buffer, h); 
				for (y = 0,yw=0; y < h; y++,yw+=width) rows_ptr[yw] = buffer[y]; 
				rows_ptr ++; 
			} 
		} 
 
    } else { 
 
		for (l = levels-1; l >= 0; l--) { 
			w = width >> l; 
			h = height >> l; 
 
			/* Columns. */ 
	 
			rows_ptr = rows[0]; 
			for (x = 0; x < w; x++) { 
				for (y = 0,yw=0; y < h; y++,yw+=width) buffer[y] = rows_ptr[yw]; 
				inversef97(buffer, h); 
				for (y = 0,yw=0; y < h; y++,yw+=width) rows_ptr[yw] = buffer[y]; 
				rows_ptr ++; 
			} 
 
			/* Rows. */ 
	 
			for (y = 0; y < h; y++) 
				inversef97(rows[y], w); 
    	} 
	} 
 
	free(x_alloc); x_alloc = NULL; 
	free(buffer); 
} 
 
 
void f97Quad(int *wave,int width,int height,int fullw,bool inverse) 
{ 
int x, y, yw; 
int *buffer,*wave_ptr; 
 
	if ( (x_alloc = malloc(sizeof(int)*(width+height+F_EXTPAD+F_EXTPAD))) == NULL )  { 
		errputs("malloc failed"); exit(10); 
	} 
  
   	if ( (buffer = newarray(int,height)) == NULL ) { 
		errputs("malloc failed"); exit(10); 
	} 
 
    /* Compute the wavelet transform. */ 
   
	if ( !inverse ) { /* forward transform. */ 
 
		wave_ptr = wave; 
		for (y = 0; y < height; y++) { 
			forwardf97(wave_ptr, width); 
			wave_ptr += fullw; 
		} 
     
		wave_ptr = wave; 
		for (x = 0; x < width; x++) { 
			for (y = 0,yw=0; y < height; y++,yw+=fullw) buffer[y] = wave_ptr[yw]; 
			forwardf97(buffer, height); 
			for (y = 0,yw=0; y < height; y++,yw+=fullw) wave_ptr[yw] = buffer[y]; 
			wave_ptr ++; 
		} 
 
    } else { 
 
		wave_ptr = wave; 
		for (x = 0; x < width; x++) { 
			for (y = 0,yw=0; y < height; y++,yw+=fullw) buffer[y] = wave_ptr[yw]; 
			inversef97(buffer, height); 
			for (y = 0,yw=0; y < height; y++,yw+=fullw) wave_ptr[yw] = buffer[y]; 
			wave_ptr ++; 
		} 
 
		wave_ptr = wave; 
		for (y = 0; y < height; y++) { 
			inversef97(wave_ptr, width); 
			wave_ptr += fullw; 
		} 
    } 
 
	free(x_alloc); x_alloc = NULL; 
	free(buffer); 
}