mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-03 20:38:59 +00:00 
			
		
		
		
	
		
			
	
	
		
			117 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			117 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;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |