blob: bdeba0194a4f6c87d4d635fef71aebb4077e7c85 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
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 */
120typedef 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 */
132typedef 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 */
173typedef 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