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 MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DEFINES_H_
19 #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DEFINES_H_
20 
21 #include <string.h>
22 
23 #include "common_audio/signal_processing/include/signal_processing_library.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                                                         \
71   3 /* 2*ENH_HL+1 is number blocks                                     \
72                                                         in said second \
73        sequence */
74 #define ENH_SLOP                    \
75   2 /* max difference estimated and \
76                                                        correct pitch period */
77 #define ENH_PLOCSL                                                          \
78   8 /* pitch-estimates and                                                  \
79                                                      pitch-locations buffer \
80        length */
81 #define ENH_OVERHANG 2
82 #define ENH_UPS0 4 /* upsampling rate */
83 #define ENH_FL0 3  /* 2*FLO+1 is the length of each filter */
84 #define ENH_FLO_MULT2_PLUS1 7
85 #define ENH_VECTL (ENH_BLOCKL + 2 * ENH_FL0)
86 #define ENH_CORRDIM (2 * ENH_SLOP + 1)
87 #define ENH_NBLOCKS (BLOCKL / ENH_BLOCKL)
88 #define ENH_NBLOCKS_EXTRA 5
89 #define ENH_NBLOCKS_TOT 8 /* ENH_NBLOCKS+ENH_NBLOCKS_EXTRA */
90 #define ENH_BUFL (ENH_NBLOCKS_TOT) * ENH_BLOCKL
91 #define ENH_BUFL_FILTEROVERHEAD 3
92 #define ENH_A0 819                      /* Q14 */
93 #define ENH_A0_MINUS_A0A0DIV4 848256041 /* Q34 */
94 #define ENH_A0DIV2 26843546             /* Q30 */
95 
96 /* PLC */
97 
98 /* Down sampling */
99 
100 #define FILTERORDER_DS_PLUS1 7
101 #define DELAY_DS 3
102 #define FACTOR_DS 2
103 
104 /* bit stream defs */
105 
106 #define NO_OF_BYTES_20MS 38
107 #define NO_OF_BYTES_30MS 50
108 #define NO_OF_WORDS_20MS 19
109 #define NO_OF_WORDS_30MS 25
110 #define STATE_BITS 3
111 #define BYTE_LEN 8
112 #define ULP_CLASSES 3
113 
114 /* help parameters */
115 
116 #define TWO_PI_FIX 25736 /* Q12 */
117 
118 /* Constants for codebook search and creation */
119 
120 #define ST_MEM_L_TBL 85
121 #define MEM_LF_TBL 147
122 
123 /* Struct for the bits */
124 typedef struct iLBC_bits_t_ {
125   int16_t lsf[LSF_NSPLIT * LPC_N_MAX];
126   int16_t cb_index[CB_NSTAGES * (NASUB_MAX + 1)];   /* First CB_NSTAGES values
127                                                        contains extra CB index */
128   int16_t gain_index[CB_NSTAGES * (NASUB_MAX + 1)]; /* First CB_NSTAGES values
129                                                        contains extra CB gain */
130   size_t idxForMax;
131   int16_t state_first;
132   int16_t idxVec[STATE_SHORT_LEN_30MS];
133   int16_t firstbits;
134   size_t startIdx;
135 } iLBC_bits;
136 
137 /* type definition encoder instance */
138 typedef struct IlbcEncoder_ {
139   /* flag for frame size mode */
140   int16_t mode;
141 
142   /* basic parameters for different frame sizes */
143   size_t blockl;
144   size_t nsub;
145   int16_t nasub;
146   size_t no_of_bytes, no_of_words;
147   int16_t lpc_n;
148   size_t state_short_len;
149 
150   /* analysis filter state */
151   int16_t anaMem[LPC_FILTERORDER];
152 
153   /* Fix-point old lsf parameters for interpolation */
154   int16_t lsfold[LPC_FILTERORDER];
155   int16_t lsfdeqold[LPC_FILTERORDER];
156 
157   /* signal buffer for LP analysis */
158   int16_t lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];
159 
160   /* state of input HP filter */
161   int16_t hpimemx[2];
162   int16_t hpimemy[4];
163 
164 #ifdef SPLIT_10MS
165   int16_t weightdenumbuf[66];
166   int16_t past_samples[160];
167   uint16_t bytes[25];
168   int16_t section;
169   int16_t Nfor_flag;
170   int16_t Nback_flag;
171   int16_t start_pos;
172   size_t diff;
173 #endif
174 
175 } IlbcEncoder;
176 
177 /* type definition decoder instance */
178 typedef struct IlbcDecoder_ {
179   /* flag for frame size mode */
180   int16_t mode;
181 
182   /* basic parameters for different frame sizes */
183   size_t blockl;
184   size_t nsub;
185   int16_t nasub;
186   size_t no_of_bytes, no_of_words;
187   int16_t lpc_n;
188   size_t state_short_len;
189 
190   /* synthesis filter state */
191   int16_t syntMem[LPC_FILTERORDER];
192 
193   /* old LSF for interpolation */
194   int16_t lsfdeqold[LPC_FILTERORDER];
195 
196   /* pitch lag estimated in enhancer and used in PLC */
197   size_t last_lag;
198 
199   /* PLC state information */
200   int consPLICount, prev_enh_pl;
201   int16_t perSquare;
202 
203   int16_t prevScale, prevPLI;
204   size_t prevLag;
205   int16_t prevLpc[LPC_FILTERORDER + 1];
206   int16_t prevResidual[NSUB_MAX * SUBL];
207   int16_t seed;
208 
209   /* previous synthesis filter parameters */
210 
211   int16_t old_syntdenum[(LPC_FILTERORDER + 1) * NSUB_MAX];
212 
213   /* state of output HP filter */
214   int16_t hpimemx[2];
215   int16_t hpimemy[4];
216 
217   /* enhancer state information */
218   int use_enhancer;
219   int16_t enh_buf[ENH_BUFL + ENH_BUFL_FILTEROVERHEAD];
220   size_t enh_period[ENH_NBLOCKS_TOT];
221 
222 } IlbcDecoder;
223 
224 #endif
225