mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-27 06:31:54 +00:00 
			
		
		
		
	
		
			
	
	
		
			113 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | 
 | ||
|  |    /******************************************************************
 | ||
|  | 
 | ||
|  |        iLBC Speech Coder ANSI-C Source Code | ||
|  | 
 | ||
|  |        iCBConstruct.c | ||
|  | 
 | ||
|  |        Copyright (C) The Internet Society (2004). | ||
|  |        All Rights Reserved. | ||
|  | 
 | ||
|  |    ******************************************************************/ | ||
|  | 
 | ||
|  |    #include <math.h>
 | ||
|  | 
 | ||
|  |    #include "iLBC_define.h"
 | ||
|  |    #include "gainquant.h"
 | ||
|  |    #include "getCBvec.h"
 | ||
|  | 
 | ||
|  |    /*----------------------------------------------------------------*
 | ||
|  |     *  Convert the codebook indexes to make the search easier | ||
|  |     *---------------------------------------------------------------*/ | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |    void index_conv_enc( | ||
|  |        int *index          /* (i/o) Codebook indexes */ | ||
|  |    ){ | ||
|  |        int k; | ||
|  | 
 | ||
|  |        for (k=1; k<CB_NSTAGES; k++) { | ||
|  | 
 | ||
|  |            if ((index[k]>=108)&&(index[k]<172)) { | ||
|  |                index[k]-=64; | ||
|  |            } else if (index[k]>=236) { | ||
|  |                index[k]-=128; | ||
|  |            } else { | ||
|  |                /* ERROR */ | ||
|  |            } | ||
|  |        } | ||
|  |    } | ||
|  | 
 | ||
|  |    void index_conv_dec( | ||
|  |        int *index          /* (i/o) Codebook indexes */ | ||
|  |    ){ | ||
|  |        int k; | ||
|  | 
 | ||
|  |        for (k=1; k<CB_NSTAGES; k++) { | ||
|  | 
 | ||
|  |            if ((index[k]>=44)&&(index[k]<108)) { | ||
|  |                index[k]+=64; | ||
|  |            } else if ((index[k]>=108)&&(index[k]<128)) { | ||
|  |                index[k]+=128; | ||
|  |            } else { | ||
|  |                /* ERROR */ | ||
|  |            } | ||
|  |        } | ||
|  |    } | ||
|  | 
 | ||
|  |    /*----------------------------------------------------------------*
 | ||
|  |     *  Construct decoded vector from codebook and gains. | ||
|  |     *---------------------------------------------------------------*/ | ||
|  | 
 | ||
|  |    void iCBConstruct( | ||
|  |        float *decvector,   /* (o) Decoded vector */ | ||
|  |        int *index,         /* (i) Codebook indices */ | ||
|  |        int *gain_index,/* (i) Gain quantization indices */ | ||
|  |        float *mem,         /* (i) Buffer for codevector construction */ | ||
|  |        int lMem,           /* (i) Length of buffer */ | ||
|  |        int veclen,         /* (i) Length of vector */ | ||
|  |        int nStages         /* (i) Number of codebook stages */ | ||
|  |    ){ | ||
|  |        int j,k; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |        float gain[CB_NSTAGES]; | ||
|  |        float cbvec[SUBL]; | ||
|  | 
 | ||
|  |        /* gain de-quantization */ | ||
|  | 
 | ||
|  |        gain[0] = gaindequant(gain_index[0], 1.0, 32); | ||
|  |        if (nStages > 1) { | ||
|  |            gain[1] = gaindequant(gain_index[1], | ||
|  |                (float)fabs(gain[0]), 16); | ||
|  |        } | ||
|  |        if (nStages > 2) { | ||
|  |            gain[2] = gaindequant(gain_index[2], | ||
|  |                (float)fabs(gain[1]), 8); | ||
|  |        } | ||
|  | 
 | ||
|  |        /* codebook vector construction and construction of
 | ||
|  |        total vector */ | ||
|  | 
 | ||
|  |        getCBvec(cbvec, mem, index[0], lMem, veclen); | ||
|  |        for (j=0;j<veclen;j++){ | ||
|  |            decvector[j] = gain[0]*cbvec[j]; | ||
|  |        } | ||
|  |        if (nStages > 1) { | ||
|  |            for (k=1; k<nStages; k++) { | ||
|  |                getCBvec(cbvec, mem, index[k], lMem, veclen); | ||
|  |                for (j=0;j<veclen;j++) { | ||
|  |                    decvector[j] += gain[k]*cbvec[j]; | ||
|  |                } | ||
|  |            } | ||
|  |        } | ||
|  |    } | ||
|  | 
 |