mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7221 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			108 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.5 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 "gainquant.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;
 | |
| }
 | |
| 
 | |
| 
 |