📄 quant.c
字号:
/* Copyright (c) Colorado School of Mines, 2003.*//* All rights reserved. *//*********************** self documentation **********************//******************************************************************************QUANT - QUANTization routinesuniQuant - uniform quantization with a given relative RMS erroruniDequant - uniform dequantization*******************************************************************************Function Prototypes:void uniQuant(float *x, int n, float error, float *ave, float *step, int *qx);void uniDequant(float *x, int n, float ave, float step, int *qx)*******************************************************************************uniQuant:Input:x array[] of input signaln length of the signalerror relative RMS errorave average of the input signalstep stepsize used in quantizationOutput:qx array[] output integersuniDequant:Input:n length of the signalave average of the signalstep stepsize used in quantizationqx array[] input integersOutput:x array[] of output signal*******************************************************************************Author: Tong Chen, 07/15/94Modifier: Tong Chen, 05/30/95, for unified interface******************************************************************************/#include "comp.h"#define ERRATIO 3.4641void uniQuant(float *x, int n, float error, float *ave, float *step, int *qx)/******************************************************************************uniform quantization with a given relative RMS error*******************************************************************************x array[] of input signaln length of the signalerror relative RMS errorave average of the input signalstep stepsize used in quantizationqx array[] output integers******************************************************************************/{ int i; float rn, atmp, dev, lave, lstep; float *g; /* allocate temporary space */ g = alloc1float(n); rn = 1.0f/n; lave = 0.; /* average, or mean-value */ for(i=0; i<n; i++) lave += x[i]; lave *= rn; lstep = *step;/* fprintf(stderr,"average=%f\n", lave); for(i=0; i<n; i++) fprintf(stderr,"f[%d]=%f\n", i, x[i]);*/ /* if no deviation calculated */ if(lstep < 0.) { dev = 0.; /* standard deviation, or RMS */ for(i=0; i<n; i++) { g[i] = x[i] - lave; atmp = ABS(g[i]); dev += atmp*atmp; } dev *= rn; dev = (float)sqrt(dev); } /* else */ else{ for(i=0; i<n; i++) g[i] = x[i] - lave; dev = lstep; } /* stepsize used in quantization */ lstep = (float)(dev*error*ERRATIO); lstep = 1.0f/lstep; fprintf(stderr,"lstep=%f\n", lstep); /* uniform quantization */ for(i=0; i<n; i++) { atmp = g[i]*lstep;/* qx[i] = NINT(atmp);*/ qx[i] = (atmp > 0.)? ((int) (atmp+.5)) : ((int) (atmp-.5)); } fprintf(stderr,"after quantization\n"); /* average and stepsize */ *ave = lave; *step = lstep; /* free the workspace */ free1float(g);}void uniDequant(float *x, int n, float ave, float step, int *qx)/******************************************************************************uniform quantization with a given relative RMS error*******************************************************************************x array[] of output signaln length of the signalave average of the signalstep stepsize used in quantizationqx array[] input integers******************************************************************************/{ int i; float rstep; rstep = 1.0f/step; for(i=0; i<n; i++) x[i] = ave + qx[i]*rstep;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -