Mercurial > hg > audiostuff
diff intercom/ilbc/gainquant.c @ 2:13be24d74cd2
import intercom-0.4.1
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 09:57:52 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/intercom/ilbc/gainquant.c Fri Jun 25 09:57:52 2010 +0200 @@ -0,0 +1,111 @@ + + /****************************************************************** + + 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; +}