mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-04 05:15:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			111 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;
 | 
						|
   }
 |