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; | ||
|  |    } |