1 /*
2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 /******************************************************************
12 
13  iLBC Speech Coder ANSI-C Source Code
14 
15  define.h
16 
17 ******************************************************************/
18 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DEFINES_H_
19 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DEFINES_H_
20 
21 #include "typedefs.h"
22 #include "signal_processing_library.h"
23 #include <string.h>
24 
25 /* general codec settings */
26 
27 #define FS       8000
28 #define BLOCKL_20MS     160
29 #define BLOCKL_30MS     240
30 #define BLOCKL_MAX     240
31 #define NSUB_20MS     4
32 #define NSUB_30MS     6
33 #define NSUB_MAX     6
34 #define NASUB_20MS     2
35 #define NASUB_30MS     4
36 #define NASUB_MAX     4
37 #define SUBL      40
38 #define STATE_LEN     80
39 #define STATE_SHORT_LEN_30MS  58
40 #define STATE_SHORT_LEN_20MS  57
41 
42 /* LPC settings */
43 
44 #define LPC_FILTERORDER    10
45 #define LPC_LOOKBACK    60
46 #define LPC_N_20MS     1
47 #define LPC_N_30MS     2
48 #define LPC_N_MAX     2
49 #define LPC_ASYMDIFF    20
50 #define LSF_NSPLIT     3
51 #define LSF_NUMBER_OF_STEPS   4
52 #define LPC_HALFORDER    5
53 #define COS_GRID_POINTS 60
54 
55 /* cb settings */
56 
57 #define CB_NSTAGES     3
58 #define CB_EXPAND     2
59 #define CB_MEML      147
60 #define CB_FILTERLEN    (2*4)
61 #define CB_HALFFILTERLEN   4
62 #define CB_RESRANGE     34
63 #define CB_MAXGAIN_FIXQ6   83 /* error = -0.24% */
64 #define CB_MAXGAIN_FIXQ14   21299
65 
66 /* enhancer */
67 
68 #define ENH_BLOCKL     80  /* block length */
69 #define ENH_BLOCKL_HALF    (ENH_BLOCKL/2)
70 #define ENH_HL      3  /* 2*ENH_HL+1 is number blocks
71                                                                            in said second sequence */
72 #define ENH_SLOP     2  /* max difference estimated and
73                                                                            correct pitch period */
74 #define ENH_PLOCSL     8  /* pitch-estimates and
75                                                                            pitch-locations buffer length */
76 #define ENH_OVERHANG    2
77 #define ENH_UPS0     4  /* upsampling rate */
78 #define ENH_FL0      3  /* 2*FLO+1 is the length of each filter */
79 #define ENH_FLO_MULT2_PLUS1   7
80 #define ENH_VECTL     (ENH_BLOCKL+2*ENH_FL0)
81 #define ENH_CORRDIM     (2*ENH_SLOP+1)
82 #define ENH_NBLOCKS     (BLOCKL/ENH_BLOCKL)
83 #define ENH_NBLOCKS_EXTRA   5
84 #define ENH_NBLOCKS_TOT    8 /* ENH_NBLOCKS+ENH_NBLOCKS_EXTRA */
85 #define ENH_BUFL     (ENH_NBLOCKS_TOT)*ENH_BLOCKL
86 #define ENH_BUFL_FILTEROVERHEAD  3
87 #define ENH_A0      819   /* Q14 */
88 #define ENH_A0_MINUS_A0A0DIV4  848256041 /* Q34 */
89 #define ENH_A0DIV2     26843546 /* Q30 */
90 
91 /* PLC */
92 
93 /* Down sampling */
94 
95 #define FILTERORDER_DS_PLUS1  7
96 #define DELAY_DS     3
97 #define FACTOR_DS     2
98 
99 /* bit stream defs */
100 
101 #define NO_OF_BYTES_20MS   38
102 #define NO_OF_BYTES_30MS   50
103 #define NO_OF_WORDS_20MS   19
104 #define NO_OF_WORDS_30MS   25
105 #define STATE_BITS     3
106 #define BYTE_LEN     8
107 #define ULP_CLASSES     3
108 
109 /* help parameters */
110 
111 #define TWO_PI_FIX     25736 /* Q12 */
112 
113 /* Constants for codebook search and creation */
114 
115 #define ST_MEM_L_TBL  85
116 #define MEM_LF_TBL  147
117 
118 
119 /* Struct for the bits */
120 typedef struct iLBC_bits_t_ {
121   WebRtc_Word16 lsf[LSF_NSPLIT*LPC_N_MAX];
122   WebRtc_Word16 cb_index[CB_NSTAGES*(NASUB_MAX+1)];  /* First CB_NSTAGES values contains extra CB index */
123   WebRtc_Word16 gain_index[CB_NSTAGES*(NASUB_MAX+1)]; /* First CB_NSTAGES values contains extra CB gain */
124   WebRtc_Word16 idxForMax;
125   WebRtc_Word16 state_first;
126   WebRtc_Word16 idxVec[STATE_SHORT_LEN_30MS];
127   WebRtc_Word16 firstbits;
128   WebRtc_Word16 startIdx;
129 } iLBC_bits;
130 
131 /* type definition encoder instance */
132 typedef struct iLBC_Enc_Inst_t_ {
133 
134   /* flag for frame size mode */
135   WebRtc_Word16 mode;
136 
137   /* basic parameters for different frame sizes */
138   WebRtc_Word16 blockl;
139   WebRtc_Word16 nsub;
140   WebRtc_Word16 nasub;
141   WebRtc_Word16 no_of_bytes, no_of_words;
142   WebRtc_Word16 lpc_n;
143   WebRtc_Word16 state_short_len;
144 
145   /* analysis filter state */
146   WebRtc_Word16 anaMem[LPC_FILTERORDER];
147 
148   /* Fix-point old lsf parameters for interpolation */
149   WebRtc_Word16 lsfold[LPC_FILTERORDER];
150   WebRtc_Word16 lsfdeqold[LPC_FILTERORDER];
151 
152   /* signal buffer for LP analysis */
153   WebRtc_Word16 lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];
154 
155   /* state of input HP filter */
156   WebRtc_Word16 hpimemx[2];
157   WebRtc_Word16 hpimemy[4];
158 
159 #ifdef SPLIT_10MS
160   WebRtc_Word16 weightdenumbuf[66];
161   WebRtc_Word16 past_samples[160];
162   WebRtc_UWord16 bytes[25];
163   WebRtc_Word16 section;
164   WebRtc_Word16 Nfor_flag;
165   WebRtc_Word16 Nback_flag;
166   WebRtc_Word16 start_pos;
167   WebRtc_Word16 diff;
168 #endif
169 
170 } iLBC_Enc_Inst_t;
171 
172 /* type definition decoder instance */
173 typedef struct iLBC_Dec_Inst_t_ {
174 
175   /* flag for frame size mode */
176   WebRtc_Word16 mode;
177 
178   /* basic parameters for different frame sizes */
179   WebRtc_Word16 blockl;
180   WebRtc_Word16 nsub;
181   WebRtc_Word16 nasub;
182   WebRtc_Word16 no_of_bytes, no_of_words;
183   WebRtc_Word16 lpc_n;
184   WebRtc_Word16 state_short_len;
185 
186   /* synthesis filter state */
187   WebRtc_Word16 syntMem[LPC_FILTERORDER];
188 
189   /* old LSF for interpolation */
190   WebRtc_Word16 lsfdeqold[LPC_FILTERORDER];
191 
192   /* pitch lag estimated in enhancer and used in PLC */
193   int last_lag;
194 
195   /* PLC state information */
196   int consPLICount, prev_enh_pl;
197   WebRtc_Word16 perSquare;
198 
199   WebRtc_Word16 prevScale, prevPLI;
200   WebRtc_Word16 prevLag, prevLpc[LPC_FILTERORDER+1];
201   WebRtc_Word16 prevResidual[NSUB_MAX*SUBL];
202   WebRtc_Word16 seed;
203 
204   /* previous synthesis filter parameters */
205 
206   WebRtc_Word16 old_syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
207 
208   /* state of output HP filter */
209   WebRtc_Word16 hpimemx[2];
210   WebRtc_Word16 hpimemy[4];
211 
212   /* enhancer state information */
213   int use_enhancer;
214   WebRtc_Word16 enh_buf[ENH_BUFL+ENH_BUFL_FILTEROVERHEAD];
215   WebRtc_Word16 enh_period[ENH_NBLOCKS_TOT];
216 
217 } iLBC_Dec_Inst_t;
218 
219 #endif
220