111 lines
2.6 KiB
C
111 lines
2.6 KiB
C
|
|
/******************************************************************
|
|
|
|
iLBC Speech Coder ANSI-C Source Code
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gainquant.c
|
|
|
|
Copyright (C) The Internet Society (2004).
|
|
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;
|
|
}
|