/src/pjsip/third_party/ilbc/FrameClassify.c
Line | Count | Source |
1 | | |
2 | | /****************************************************************** |
3 | | |
4 | | iLBC Speech Coder ANSI-C Source Code |
5 | | |
6 | | FrameClassify.c |
7 | | |
8 | | Copyright (C) The Internet Society (2004). |
9 | | All Rights Reserved. |
10 | | |
11 | | ******************************************************************/ |
12 | | |
13 | | #include "iLBC_define.h" |
14 | | |
15 | | /*---------------------------------------------------------------* |
16 | | * Classification of subframes to localize start state |
17 | | *--------------------------------------------------------------*/ |
18 | | |
19 | | int FrameClassify( /* index to the max-energy sub-frame */ |
20 | | iLBC_Enc_Inst_t *iLBCenc_inst, |
21 | | /* (i/o) the encoder state structure */ |
22 | | float *residual /* (i) lpc residual signal */ |
23 | 449 | ) { |
24 | 449 | float max_ssqEn, fssqEn[NSUB_MAX], bssqEn[NSUB_MAX], *pp; |
25 | 449 | int n, l, max_ssqEn_n; |
26 | 449 | const float ssqEn_win[NSUB_MAX-1]={(float)0.8,(float)0.9, |
27 | 449 | (float)1.0,(float)0.9,(float)0.8}; |
28 | 449 | const float sampEn_win[5]={(float)1.0/(float)6.0, |
29 | 449 | (float)2.0/(float)6.0, (float)3.0/(float)6.0, |
30 | 449 | (float)4.0/(float)6.0, (float)5.0/(float)6.0}; |
31 | | |
32 | | /* init the front and back energies to zero */ |
33 | | |
34 | 449 | memset(fssqEn, 0, NSUB_MAX*sizeof(float)); |
35 | 449 | memset(bssqEn, 0, NSUB_MAX*sizeof(float)); |
36 | | |
37 | | /* Calculate front of first seqence */ |
38 | | |
39 | 449 | n=0; |
40 | 449 | pp=residual; |
41 | 2.69k | for (l=0; l<5; l++) { |
42 | 2.24k | fssqEn[n] += sampEn_win[l] * (*pp) * (*pp); |
43 | 2.24k | pp++; |
44 | 2.24k | } |
45 | 16.1k | for (l=5; l<SUBL; l++) { |
46 | | |
47 | | |
48 | | |
49 | | |
50 | | |
51 | 15.7k | fssqEn[n] += (*pp) * (*pp); |
52 | 15.7k | pp++; |
53 | 15.7k | } |
54 | | |
55 | | /* Calculate front and back of all middle sequences */ |
56 | | |
57 | 2.24k | for (n=1; n<iLBCenc_inst->nsub-1; n++) { |
58 | 1.79k | pp=residual+n*SUBL; |
59 | 10.7k | for (l=0; l<5; l++) { |
60 | 8.98k | fssqEn[n] += sampEn_win[l] * (*pp) * (*pp); |
61 | 8.98k | bssqEn[n] += (*pp) * (*pp); |
62 | 8.98k | pp++; |
63 | 8.98k | } |
64 | 55.6k | for (l=5; l<SUBL-5; l++) { |
65 | 53.8k | fssqEn[n] += (*pp) * (*pp); |
66 | 53.8k | bssqEn[n] += (*pp) * (*pp); |
67 | 53.8k | pp++; |
68 | 53.8k | } |
69 | 10.7k | for (l=SUBL-5; l<SUBL; l++) { |
70 | 8.98k | fssqEn[n] += (*pp) * (*pp); |
71 | 8.98k | bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp); |
72 | 8.98k | pp++; |
73 | 8.98k | } |
74 | 1.79k | } |
75 | | |
76 | | /* Calculate back of last seqence */ |
77 | | |
78 | 449 | n=iLBCenc_inst->nsub-1; |
79 | 449 | pp=residual+n*SUBL; |
80 | 16.1k | for (l=0; l<SUBL-5; l++) { |
81 | 15.7k | bssqEn[n] += (*pp) * (*pp); |
82 | 15.7k | pp++; |
83 | 15.7k | } |
84 | 2.69k | for (l=SUBL-5; l<SUBL; l++) { |
85 | 2.24k | bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp); |
86 | 2.24k | pp++; |
87 | 2.24k | } |
88 | | |
89 | | /* find the index to the weighted 80 sample with |
90 | | most energy */ |
91 | | |
92 | 449 | if (iLBCenc_inst->mode==20) l=1; |
93 | 449 | else l=0; |
94 | | |
95 | 449 | max_ssqEn=(fssqEn[0]+bssqEn[1])*ssqEn_win[l]; |
96 | 449 | max_ssqEn_n=1; |
97 | 2.24k | for (n=2; n<iLBCenc_inst->nsub; n++) { |
98 | | |
99 | | |
100 | | |
101 | | |
102 | | |
103 | | |
104 | 1.79k | l++; |
105 | 1.79k | if ((fssqEn[n-1]+bssqEn[n])*ssqEn_win[l] > max_ssqEn) { |
106 | 588 | max_ssqEn=(fssqEn[n-1]+bssqEn[n]) * |
107 | 588 | ssqEn_win[l]; |
108 | 588 | max_ssqEn_n=n; |
109 | 588 | } |
110 | 1.79k | } |
111 | | |
112 | 449 | return max_ssqEn_n; |
113 | 449 | } |
114 | | |