330796d7ba6ea8511b09ff3596cee6868cedec8e
[asterisk/asterisk.git] / codecs / ilbc / LPCencode.c
1  
2 /****************************************************************** 
3  
4     iLBC Speech Coder ANSI-C Source Code 
5  
6     LPCencode.c  
7  
8     Copyright (c) 2001, 
9     Global IP Sound AB. 
10     All rights reserved. 
11  
12 ******************************************************************/ 
13  
14 #include <string.h> 
15  
16 #include "iLBC_define.h" 
17 #include "helpfun.h" 
18 #include "lsf.h" 
19 #include "constants.h" 
20  
21 /*----------------------------------------------------------------* 
22  *  lpc analysis (subrutine to LPCencode)                            
23  *---------------------------------------------------------------*/ 
24  
25 void SimpleAnalysis( 
26     float *lsf,         /* (o) lsf coefficients */ 
27     float *data,    /* (i) new data vector */ 
28     float *lpc_buffer   /* (i) buffer containing old data */  
29 ){ 
30     int k, is; 
31     float temp[BLOCKL], lp[LPC_FILTERORDER + 1]; 
32     float lp2[LPC_FILTERORDER + 1]; 
33     float r[LPC_FILTERORDER + 1]; 
34  
35     memcpy(lpc_buffer+LPC_LOOKBACK,data,BLOCKL*sizeof(float)); 
36      
37     /* No lookahead, last window is asymmetric */ 
38      
39     for (k = 0; k < LPC_N; k++) { 
40          
41         is = LPC_LOOKBACK; 
42  
43         if (k < (LPC_N - 1)) { 
44             window(temp, lpc_winTbl, lpc_buffer, BLOCKL); 
45         } else { 
46             window(temp, lpc_asymwinTbl, lpc_buffer + is, BLOCKL); 
47         } 
48          
49         autocorr(r, temp, BLOCKL, LPC_FILTERORDER); 
50         window(r, r, lpc_lagwinTbl, LPC_FILTERORDER + 1); 
51          
52         levdurb(lp, temp, r, LPC_FILTERORDER); 
53         bwexpand(lp2, lp, LPC_CHIRP_SYNTDENUM, LPC_FILTERORDER+1); 
54  
55         a2lsf(lsf + k*LPC_FILTERORDER, lp2); 
56     } 
57     memcpy(lpc_buffer, lpc_buffer+BLOCKL,  
58         LPC_LOOKBACK*sizeof(float)); 
59
60  
61 /*----------------------------------------------------------------* 
62  *  lsf interpolator and conversion from lsf to a coefficients 
63  *  (subrutine to SimpleInterpolateLSF)                            
64  *---------------------------------------------------------------*/ 
65  
66 void LSFinterpolate2a_enc( 
67     float *a,       /* (o) lpc coefficients */  
68     float *lsf1,/* (i) first set of lsf coefficients */ 
69     float *lsf2,/* (i) second set of lsf coefficients */ 
70     float coef,     /* (i) weighting coefficient to use between lsf1  
71                            and lsf2 */ 
72     long length     /* (i) length of coefficient vectors */ 
73 ){   
74     float  lsftmp[LPC_FILTERORDER]; 
75      
76     interpolate(lsftmp, lsf1, lsf2, coef, length); 
77     lsf2a(a, lsftmp); 
78
79  
80 /*----------------------------------------------------------------* 
81  *  lsf interpolator (subrutine to LPCencode)                            
82  *---------------------------------------------------------------*/ 
83  
84 void SimpleInterpolateLSF( 
85     float *syntdenum,   /* (o) the synthesis filter denominator  
86                                resulting from the quantized  
87                                interpolated lsf */ 
88     float *weightdenum, /* (o) the weighting filter denominator  
89                                resulting from the unquantized  
90                                interpolated lsf */ 
91     float *lsf,         /* (i) the unquantized lsf coefficients */ 
92     float *lsfdeq,      /* (i) the dequantized lsf coefficients */ 
93     float *lsfold,      /* (i) the unquantized lsf coefficients of  
94                                the previous signal frame */ 
95     float *lsfdeqold,   /* (i) the dequantized lsf coefficients of  
96                                the previous signal frame */ 
97     int length          /* (i) should equate FILTERORDER */ 
98 ){ 
99     int    i, pos, lp_length; 
100     float  lp[LPC_FILTERORDER + 1], *lsf2, *lsfdeq2; 
101      
102     lsf2 = lsf + length; 
103     lsfdeq2 = lsfdeq + length; 
104     lp_length = length + 1; 
105      
106     /* subframe 1: Interpolation between old and first set of  
107     lsf coefficients */ 
108  
109     LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq,  
110         lsf_weightTbl[0], length); 
111     memcpy(syntdenum,lp,lp_length*sizeof(float)); 
112     LSFinterpolate2a_enc(lp, lsfold, lsf, lsf_weightTbl[0], length); 
113     bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, lp_length); 
114  
115     /* subframe 2 to 6: Interpolation between first and second  
116     set of lsf coefficients */ 
117      
118     pos = lp_length; 
119     for (i = 1; i < NSUB; i++) { 
120         LSFinterpolate2a_enc(lp, lsfdeq, lsfdeq2,  
121             lsf_weightTbl[i], length); 
122         memcpy(syntdenum + pos,lp,lp_length*sizeof(float)); 
123          
124         LSFinterpolate2a_enc(lp, lsf, lsf2,  
125             lsf_weightTbl[i], length); 
126         bwexpand(weightdenum + pos, lp,  
127             LPC_CHIRP_WEIGHTDENUM, lp_length); 
128         pos += lp_length; 
129     } 
130      
131     /* update memory */ 
132  
133     memcpy(lsfold, lsf2, length*sizeof(float)); 
134     memcpy(lsfdeqold, lsfdeq2, length*sizeof(float)); 
135
136  
137 /*----------------------------------------------------------------* 
138  *  lsf quantizer (subrutine to LPCencode)                            
139  *---------------------------------------------------------------*/ 
140  
141 void SimplelsfQ( 
142     float *lsfdeq,  /* (o) dequantized lsf coefficients  
143                            (dimension FILTERORDER) */ 
144     int *index,     /* (o) quantization index */ 
145     float *lsf      /* (i) the lsf coefficient vector to be  
146                            quantized (dimension FILTERORDER ) */ 
147 ){     
148     /* Quantize first LSF with memoryless split VQ */ 
149     SplitVQ(lsfdeq, index, lsf, lsfCbTbl, LSF_NSPLIT,  
150         dim_lsfCbTbl, size_lsfCbTbl); 
151  
152     /* Quantize second LSF with memoryless split VQ */ 
153     SplitVQ(lsfdeq + LPC_FILTERORDER, index + LSF_NSPLIT,  
154         lsf + LPC_FILTERORDER, lsfCbTbl, LSF_NSPLIT,  
155         dim_lsfCbTbl, size_lsfCbTbl); 
156
157  
158 /*----------------------------------------------------------------* 
159  *  lpc encoder                            
160  *---------------------------------------------------------------*/ 
161  
162 void LPCencode(  
163     float *syntdenum,   /* (i/o) synthesis filter coefficients  
164                                before/after encoding */ 
165     float *weightdenum, /* (i/o) weighting denumerator coefficients 
166                                before/after encoding */ 
167     int *lsf_index,     /* (o) lsf quantization index */ 
168     float *data,    /* (i) lsf coefficients to quantize */ 
169     iLBC_Enc_Inst_t *iLBCenc_inst  
170                         /* (i/o) the encoder state structure */ 
171 ){ 
172     float lsf[LPC_FILTERORDER * LPC_N]; 
173     float lsfdeq[LPC_FILTERORDER * LPC_N]; 
174     int change=0; 
175      
176     SimpleAnalysis(lsf, data, (*iLBCenc_inst).lpc_buffer);  
177     SimplelsfQ(lsfdeq, lsf_index, lsf); 
178     change=LSF_check(lsfdeq, LPC_FILTERORDER, LPC_N); 
179     SimpleInterpolateLSF(syntdenum, weightdenum,  
180         lsf, lsfdeq, (*iLBCenc_inst).lsfold,  
181         (*iLBCenc_inst).lsfdeqold, LPC_FILTERORDER); 
182
183  
184