/src/pjsip/third_party/ilbc/StateConstructW.c
Line | Count | Source |
1 | | |
2 | | /****************************************************************** |
3 | | |
4 | | iLBC Speech Coder ANSI-C Source Code |
5 | | |
6 | | StateConstructW.c |
7 | | |
8 | | Copyright (C) The Internet Society (2004). |
9 | | All Rights Reserved. |
10 | | |
11 | | ******************************************************************/ |
12 | | |
13 | | #include <math.h> |
14 | | #include <string.h> |
15 | | |
16 | | #include "iLBC_define.h" |
17 | | #include "constants.h" |
18 | | #include "filter.h" |
19 | | |
20 | | /*----------------------------------------------------------------* |
21 | | * decoding of the start state |
22 | | *---------------------------------------------------------------*/ |
23 | | |
24 | | void StateConstructW( |
25 | | int idxForMax, /* (i) 6-bit index for the quantization of |
26 | | max amplitude */ |
27 | | int *idxVec, /* (i) vector of quantization indexes */ |
28 | | float *syntDenum, /* (i) synthesis filter denumerator */ |
29 | | |
30 | | |
31 | | |
32 | | |
33 | | |
34 | | float *out, /* (o) the decoded state vector */ |
35 | | int len /* (i) length of a state vector */ |
36 | 611 | ){ |
37 | 611 | float maxVal, tmpbuf[LPC_FILTERORDER+2*STATE_LEN], *tmp, |
38 | 611 | numerator[LPC_FILTERORDER+1]; |
39 | 611 | float foutbuf[LPC_FILTERORDER+2*STATE_LEN], *fout; |
40 | 611 | int k,tmpi; |
41 | | |
42 | | /* decoding of the maximum value */ |
43 | | |
44 | 611 | maxVal = state_frgqTbl[idxForMax]; |
45 | 611 | maxVal = (float)pow(10,maxVal)/(float)4.5; |
46 | | |
47 | | /* initialization of buffers and coefficients */ |
48 | | |
49 | 611 | memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float)); |
50 | 611 | memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float)); |
51 | 6.72k | for (k=0; k<LPC_FILTERORDER; k++) { |
52 | 6.11k | numerator[k]=syntDenum[LPC_FILTERORDER-k]; |
53 | 6.11k | } |
54 | 611 | numerator[LPC_FILTERORDER]=syntDenum[0]; |
55 | 611 | tmp = &tmpbuf[LPC_FILTERORDER]; |
56 | 611 | fout = &foutbuf[LPC_FILTERORDER]; |
57 | | |
58 | | /* decoding of the sample values */ |
59 | | |
60 | 36.0k | for (k=0; k<len; k++) { |
61 | 35.4k | tmpi = len-1-k; |
62 | | /* maxVal = 1/scal */ |
63 | 35.4k | tmp[k] = maxVal*state_sq3Tbl[idxVec[tmpi]]; |
64 | 35.4k | } |
65 | | |
66 | | /* circular convolution with all-pass filter */ |
67 | | |
68 | 611 | memset(tmp+len, 0, len*sizeof(float)); |
69 | 611 | ZeroPoleFilter(tmp, numerator, syntDenum, 2*len, |
70 | 611 | LPC_FILTERORDER, fout); |
71 | 36.0k | for (k=0;k<len;k++) { |
72 | 35.4k | out[k] = fout[len-1-k]+fout[2*len-1-k]; |
73 | 35.4k | } |
74 | 611 | } |
75 | | |
76 | | |
77 | | |
78 | | |
79 | | |
80 | | |
81 | | |
82 | | |
83 | | |
84 | | |
85 | | |
86 | | |