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

📄 wpcquant.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       *//* WPCQUANT: $Revision: 1.3 $ ; $Date: 1997/01/10 22:28:41 $	*//*********************** self documentation **********************//****************************************************************************WPCQUANT - quantization routines for WPCquantFixerror - quantizequantDe	- dequantize*****************************************************************************Function Prototypes:void quantFixerror(float **x, float error, void *inconf, void *qstate);void quantDe(float **x, void *inconf, void *qstate);*****************************************************************************quantFixerror:Input:x		array[][] for the floats error		percent RMS error tolerable inconf		configuration infoqstate		quantization statusquantDe:x		array[][] for the floats inconf		configuration infoqstate		quantization status*****************************************************************************Author:		Tong Chen, 07/20/94Modifier:	Tong Chen, 07/28/94, for API, without iteration*****************************************************************************//**************** end self doc ********************************/#include "wpc.h"#include "wpclib.h"#define QUANTBYTEMAXINT 126./*#define QUANTERRATIO 5.4*/#define QUANTERRATIO 5#define QUANTZEROFLAGY 1#define QUANTZEROFLAGN 0#define QUANTFLOWFLAGY 1#define QUANTFLOWFLAGN 0void quantFixerror(float **x, float error, void *inconf, void *qstate)/*******************************************************************************quantization ********************************************************************************x		array[][] for the floats error		percent RMS error tolerable inconf		configuration infoqstate		quantization status********************************************************************************Author:		Tong Chen, 07/20/94Modifier:	Tong Chen, 07/28/94, for API, without iteration*******************************************************************************/{	wpcCONFIG *config = (wpcCONFIG *) inconf;	wpcQUANT *quant = (wpcQUANT *) qstate;	int nblock, lblock, tileszt, tileszx, nsz;	int i;	int iblock;	float *fmax, *dev;	int **qx, *blockind;	unsigned char *flowflag, *cblockind;	float atmp, average; 	float clip, loading, bound, step_factor, rn, ratio; 	/* obtain the configuration info */	nblock = config->nblock;	lblock = config->lblock;	tileszt = config->tileszt;	tileszx = config->tileszx;	/* quantization status */	qx = quant->qx;	flowflag = quant->flowflag;	cblockind = quant->blockind;	nsz = tileszt*tileszx;	/* spaces */	fmax = alloc1float(nblock);	dev = alloc1float(nblock);	blockind = alloc1int(nblock);	rn = 1./((float) lblock);        /* for each difference block */	clip = 0.;        for(iblock = 0; iblock < nblock-1; iblock ++){            /* compute the maximum amplitude and deviation */	    fmax[iblock] = 0.;	    dev[iblock] = 0.;            for(i=0; i<lblock; i++){                atmp = ABS(x[iblock][i]);                if(fmax[iblock] < atmp) fmax[iblock] = atmp;                dev[iblock] += atmp*atmp;            }            clip += dev[iblock];            dev[iblock] *= rn;            dev[iblock] = sqrt(dev[iblock]);        }	/* for the average block */	average = 0.;        for(i=0;i<lblock;i++){	    average += x[nblock-1][i]; 	}	average *= rn;	/* save this average for reconstruction */	quant->ave = average;		fmax[nblock-1] = dev[nblock-1] = 0.;        for(i=0; i<lblock; i++){            x[nblock-1][i]  = x[nblock-1][i] - average;            atmp = ABS(x[nblock-1][i]);            if(fmax[nblock-1] < atmp) fmax[nblock-1] = atmp;            dev[nblock-1] += atmp*atmp;        }        clip += dev[nblock-1];        dev[nblock-1] *= rn;        dev[nblock-1] = sqrt(dev[nblock-1]);        clip = clip/((float) nsz);        clip = sqrt(clip);	/* if all zero, no quantization needed */	if(clip <= FLT_MIN){	    quant->zeroflag = QUANTZEROFLAGY; 	    return;	}	/* not all zero */	quant->zeroflag = QUANTZEROFLAGN;	error = 100.*error;	clip *= error;	/* for underflow */	if(clip < FLT_MIN) clip = FLT_MIN;	ratio = QUANTERRATIO;	bound = ratio*clip;	step_factor = QUANTBYTEMAXINT/bound;	/* for overflow */	if(step_factor > FLT_MAX) step_factor = FLT_MAX;	quant->step = step_factor;	/* quantization  */       	for(iblock = 0; iblock < nblock; iblock ++){            for(i=0; i<lblock; i++){	    	atmp = x[iblock][i]*step_factor; 			      	qx[iblock][i] = NINT(atmp);	    }	    loading = fmax[iblock]*step_factor;	    if(loading > QUANTBYTEMAXINT) 		flowflag[iblock] = QUANTFLOWFLAGY;	    else 		flowflag[iblock] = QUANTFLOWFLAGN;	}        /* sort the blocks using deviation to reduce entropy */        for(iblock=0; iblock<nblock; iblock++)             blockind[iblock] = iblock;	qkisort(nblock, dev, blockind);        for(iblock=0; iblock<nblock; iblock++)             cblockind[iblock] = blockind[iblock];	/* free spaces */	free((void *) fmax);	free((void *) dev);	free((void *) blockind);}void quantDe(float **x, void *inconf, void *qstate)/*******************************************************************************dequantization ********************************************************************************x		array[][] for the floats inconf		configuration infoqstate		quantization status********************************************************************************Author:		Tong Chen, 07/21/94*******************************************************************************/{	wpcCONFIG *config = (wpcCONFIG *) inconf;	wpcQUANT *quant = (wpcQUANT *) qstate;	int nblock, lblock;	unsigned char zeroflag;	int **qx;	int iblock, i;	float rstep, ave;	nblock = config->nblock;	lblock = config->lblock;	zeroflag = quant->zeroflag;	qx = quant->qx;	rstep = 1./(quant->step);	ave = quant->ave;	/* if all zero */	if(zeroflag == QUANTZEROFLAGY){       	    for(iblock = 0; iblock < nblock; iblock ++){            	for(i=0; i<lblock; i++){		    x[iblock][i] = 0.;		}	    }	    return;	}        for(iblock = 0; iblock < nblock; iblock ++){            for(i=0;i<lblock;i++){                x[iblock][i] = ((float) qx[iblock][i])*rstep;            }	}        for(i=0;i<lblock;i++){            x[nblock-1][i]  += ave;        }}

⌨️ 快捷键说明

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