mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +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;
 | |
|    }
 |