diff options
Diffstat (limited to 'codecs/ilbc/gainquant.c')
-rwxr-xr-x | codecs/ilbc/gainquant.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/codecs/ilbc/gainquant.c b/codecs/ilbc/gainquant.c new file mode 100755 index 000000000..be64f8a67 --- /dev/null +++ b/codecs/ilbc/gainquant.c @@ -0,0 +1,103 @@ + +/****************************************************************** + + iLBC Speech Coder ANSI-C Source Code + + gainquant.c + + Copyright (c) 2001, + Global IP Sound AB. + All rights reserved. + +******************************************************************/ + +#include <string.h> +#include <math.h> +#include "constants.h" +#include "filter.h" + +/*----------------------------------------------------------------* + * quantizer for the gain in the gain-shape coding of residual + *---------------------------------------------------------------*/ + +float gainquant(/* (o) quantized gain value */ + float in, /* (i) gain value */ + float maxIn,/* (i) maximum of gain value */ + int cblen, /* (i) number of quantization indices */ + int *index /* (o) quantization index */ +){ + int i, tindex; + float minmeasure,measure, *cb, scale; + + /* ensure a lower bound on the scaling factor */ + + scale=maxIn; + + if (scale<0.1) { + scale=(float)0.1; + } + + /* select the quantization table */ + + if (cblen == 8) { + cb = gain_sq3Tbl; + } else if (cblen == 16) { + cb = gain_sq4Tbl; + } else { + cb = gain_sq5Tbl; + } + + /* select the best index in the quantization table */ + + minmeasure=10000000.0; + tindex=0; + for (i=0;i<cblen;i++) { + measure=(in-scale*cb[i])*(in-scale*cb[i]); + + if (measure<minmeasure) { + tindex=i; + minmeasure=measure; + } + } + *index=tindex; + + /* return the quantized value */ + + return scale*cb[tindex]; +} + +/*----------------------------------------------------------------* + * decoder for quantized gains in the gain-shape coding of + * residual + *---------------------------------------------------------------*/ + +float gaindequant( /* (o) quantized gain value */ + int index, /* (i) quantization index */ + float maxIn,/* (i) maximum of unquantized gain */ + int cblen /* (i) number of quantization indices */ +){ + float scale; + + /* obtain correct scale factor */ + + scale=(float)fabs(maxIn); + + if (scale<0.1) { + scale=(float)0.1; + } + + /* select the quantization table and return the decoded value */ + + if (cblen==8) { + return scale*gain_sq3Tbl[index]; + } else if (cblen==16) { + return scale*gain_sq4Tbl[index]; + } + else if (cblen==32) { + return scale*gain_sq5Tbl[index]; + } + + return 0.0; +} + + |