Mercurial > hg > audiostuff
view intercom/ilbc/gainquant.c @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 15:50:58 +0200 |
parents | 13be24d74cd2 |
children |
line wrap: on
line source
/****************************************************************** 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; }