/****************************************************************** | |
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; | |
} | |