Mercurial > hg > audiostuff
comparison intercom/gsm/private.h @ 2:13be24d74cd2
import intercom-0.4.1
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 09:57:52 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1:9cadc470e3da | 2:13be24d74cd2 |
---|---|
1 /* | |
2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische | |
3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for | |
4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. | |
5 */ | |
6 | |
7 /*$Header: /home/kbs/jutta/src/gsm/gsm-1.0/inc/RCS/private.h,v 1.2 1993/01/29 18:25:27 jutta Exp $*/ | |
8 | |
9 /* | |
10 ************************** WARNING ****************************** | |
11 Several pseudo-functions GSM_... provide faster operation than | |
12 their equivalent true function, but may generate non-compatible | |
13 results. It is known that the implementation of GSM_ADD_2 is | |
14 not working correctly on 16-bit machines/compilers (besides | |
15 an error-free compilation!). In the safer case, compilation | |
16 should be carried out using SLOWER_BUT_SAFER defined. | |
17 Another test is using add_test.c, explained elsewhere. | |
18 -- <simao@cpqd.ansp.br> [08.Apr.94] --- | |
19 ***************************************************************** | |
20 */ | |
21 | |
22 #ifndef PRIVATE_H | |
23 #define PRIVATE_H | |
24 | |
25 typedef short word; /* 16 bit signed int */ | |
26 typedef long longword; /* 32 bit signed int */ | |
27 | |
28 typedef unsigned short uword; /* unsigned word */ | |
29 typedef unsigned long ulongword; /* unsigned longword */ | |
30 | |
31 struct gsm_state { | |
32 | |
33 word dp0[280]; | |
34 | |
35 word z1; /* preprocessing.c, Offset_com. */ | |
36 longword L_z2; /* Offset_com. */ | |
37 int mp; /* Preemphasis */ | |
38 | |
39 word u[8]; /* short_term_aly_filter.c */ | |
40 word LARpp[2][8]; /* */ | |
41 word j; /* */ | |
42 | |
43 word nrp; /* 40 *//* long_term.c, synthesis */ | |
44 word v[9]; /* short_term.c, synthesis */ | |
45 word msr; /* decoder.c, Postprocessing */ | |
46 | |
47 char verbose; /* only used if !NDEBUG */ | |
48 char fast; /* only used if FAST */ | |
49 | |
50 }; | |
51 | |
52 | |
53 #define MIN_WORD (-32768) | |
54 #define MAX_WORD ( 32767) | |
55 | |
56 #define MIN_LONGWORD ((-2147483647)-1) | |
57 #define MAX_LONGWORD ( 2147483647) | |
58 | |
59 #ifdef SASR /* >> is a signed arithmetic shift right */ | |
60 #undef SASR | |
61 #define SASR(x, by) ((x) >> (by)) | |
62 #endif /* SASR */ | |
63 | |
64 | |
65 #include "proto.h" | |
66 | |
67 /* | |
68 * Prototypes from add.c | |
69 */ | |
70 extern word gsm_mult P((word a, word b)); | |
71 extern longword gsm_L_mult P((word a, word b)); | |
72 extern word gsm_mult_r P((word a, word b)); | |
73 | |
74 extern word gsm_div P((word num, word denum)); | |
75 | |
76 extern word gsm_add P((word a, word b)); | |
77 extern longword gsm_L_add P((longword a, longword b)); | |
78 | |
79 extern word gsm_sub P((word a, word b)); | |
80 extern longword gsm_L_sub P((longword a, longword b)); | |
81 | |
82 extern word gsm_abs P((word a)); | |
83 | |
84 extern word gsm_norm P((longword a)); | |
85 | |
86 extern longword gsm_L_asl P((longword a, int n)); | |
87 extern word gsm_asl P((word a, int n)); | |
88 | |
89 extern longword gsm_L_asr P((longword a, int n)); | |
90 extern word gsm_asr P((word a, int n)); | |
91 | |
92 /* | |
93 * Inlined functions from add.h | |
94 */ | |
95 #ifndef SLOWER_BUT_SAFER | |
96 /* | |
97 * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *) \ | |
98 * (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15)) | |
99 */ | |
100 #define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ | |
101 (SASR( ((longword)(a) * (longword)(b) + 16384), 15 )) | |
102 | |
103 # define GSM_MULT(a,b) /* word a, word b, !(a == b == MIN_WORD) */ \ | |
104 (SASR( ((longword)(a) * (longword)(b)), 15 )) | |
105 | |
106 # define GSM_L_MULT(a, b) /* word a, word b */ \ | |
107 (((longword)(a) * (longword)(b)) << 1) | |
108 | |
109 # define GSM_L_ADD(a, b) \ | |
110 ( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \ | |
111 : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \ | |
112 >= (ulongword)MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 ) \ | |
113 : ((b) <= 0 ? (a) + (b) \ | |
114 : (utmp = (ulongword)(a) + (ulongword)(b)) >= (ulongword)MAX_LONGWORD \ | |
115 ? (ulongword)MAX_LONGWORD : utmp)) | |
116 | |
117 | |
118 /* Slower but portable */ | |
119 #define GSM_ADD_1(a, b) \ | |
120 ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \ | |
121 ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) | |
122 | |
123 /* Nonportable, but faster: */ | |
124 #define GSM_ADD_2(a, b) \ | |
125 ((unsigned)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \ | |
126 MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp) | |
127 | |
128 /* Now you choose: fast or portable? */ | |
129 /* #define GSM_ADD GSM_ADD_1 -> Slow & portable */ | |
130 /* #define GSM_ADD GSM_ADD_2 -> Fast & non-portable */ | |
131 #define GSM_ADD GSM_ADD_1 | |
132 | |
133 # define GSM_SUB(a, b) \ | |
134 ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \ | |
135 ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) | |
136 | |
137 # define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a)) | |
138 | |
139 #else | |
140 | |
141 /* Use these if necessary: */ | |
142 | |
143 # define GSM_MULT_R(a, b) gsm_mult_r(a, b) | |
144 # define GSM_MULT(a, b) gsm_mult(a, b) | |
145 # define GSM_L_MULT(a, b) gsm_L_mult(a, b) | |
146 | |
147 # define GSM_L_ADD(a, b) gsm_L_add(a, b) | |
148 # define GSM_ADD(a, b) gsm_add(a, b) | |
149 # define GSM_SUB(a, b) gsm_sub(a, b) | |
150 | |
151 # define GSM_ABS(a) gsm_abs(a) | |
152 | |
153 #endif /* SLOWER_BUT_SAFER */ | |
154 | |
155 /* | |
156 * More prototypes from implementations.. | |
157 */ | |
158 extern void Gsm_Coder P((struct gsm_state * S, word * s, /* [0..159] samples IN */ | |
159 word * LARc, /* [0..7] LAR coefficients OUT */ | |
160 word * Nc, /* [0..3] LTP lag OUT */ | |
161 word * bc, /* [0..3] coded LTP gain OUT */ | |
162 word * Mc, /* [0..3] RPE grid selection OUT */ | |
163 word * xmaxc, /* [0..3] Coded maximum amplitude OUT */ | |
164 word * xMc /* [13*4] normalized RPE samples OUT */ )); | |
165 | |
166 extern void Gsm_Long_Term_Predictor P(( /* 4x for 160 samples */ | |
167 struct gsm_state * S, word * d, /* [0..39] residual signal IN */ | |
168 word * dp, /* [-120..-1] d' IN */ | |
169 word * e, /* [0..40] OUT */ | |
170 word * dpp, /* [0..40] OUT */ | |
171 word * Nc, /* correlation lag OUT */ | |
172 word * bc /* gain factor OUT */ )); | |
173 | |
174 extern void Gsm_LPC_Analysis P((struct gsm_state * S, word * s, /* 0..159 signals IN/OUT */ | |
175 word * LARc)); /* 0..7 LARc's OUT */ | |
176 | |
177 extern void Gsm_Preprocess P((struct gsm_state * S, | |
178 word * s, word * so)); | |
179 | |
180 extern void Gsm_Encoding P((struct gsm_state * S, | |
181 word * e, word * ep, word * xmaxc, word * Mc, word * xMc)); | |
182 | |
183 extern void Gsm_Short_Term_Analysis_Filter P((struct gsm_state * S, word * LARc, /* coded log area ratio [0..7] IN */ | |
184 word * d /* st res. signal [0..159] IN/OUT */ )); | |
185 | |
186 extern void Gsm_Decoder P((struct gsm_state * S, word * LARcr, /* [0..7] IN */ | |
187 word * Ncr, /* [0..3] IN */ | |
188 word * bcr, /* [0..3] IN */ | |
189 word * Mcr, /* [0..3] IN */ | |
190 word * xmaxcr, /* [0..3] IN */ | |
191 word * xMcr, /* [0..13*4] IN */ | |
192 word * s)); /* [0..159] OUT */ | |
193 | |
194 extern void Gsm_Decoding P((struct gsm_state * S, word xmaxcr, word Mcr, word * xMcr, /* [0..12] IN */ | |
195 word * erp)); /* [0..39] OUT */ | |
196 | |
197 extern void Gsm_Long_Term_Synthesis_Filtering P((struct gsm_state * S, word Ncr, word bcr, word * erp, /* [0..39] IN */ | |
198 word * drp)); /* [-120..-1] IN, [0..40] OUT */ | |
199 | |
200 extern void Gsm_Short_Term_Synthesis_Filter P((struct gsm_state * S, word * LARcr, /* log area ratios [0..7] IN */ | |
201 word * drp, /* received d [0...39] IN */ | |
202 word * s)); /* signal s [0..159] OUT */ | |
203 | |
204 extern void Gsm_Update_of_reconstructed_short_time_residual_signal P((word * dpp, /* [0...39] IN */ | |
205 word * ep, /* [0...39] IN */ | |
206 word * dp)); /* [-120...-1] IN/OUT */ | |
207 | |
208 /* | |
209 * Tables from table.c | |
210 */ | |
211 #ifndef GSM_TABLE_C | |
212 | |
213 extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8]; | |
214 extern word gsm_INVA[8]; | |
215 extern word gsm_DLB[4], gsm_QLB[4]; | |
216 extern word gsm_H[11]; | |
217 extern word gsm_NRFAC[8]; | |
218 extern word gsm_FAC[8]; | |
219 | |
220 #endif /* GSM_TABLE_C */ | |
221 | |
222 /* | |
223 * Debugging | |
224 */ | |
225 #ifdef NDEBUG | |
226 | |
227 # define gsm_debug_words(a, b, c, d) /* nil */ | |
228 # define gsm_debug_longwords(a, b, c, d) /* nil */ | |
229 # define gsm_debug_word(a, b) /* nil */ | |
230 # define gsm_debug_longword(a, b) /* nil */ | |
231 | |
232 #else /* !NDEBUG => DEBUG */ | |
233 | |
234 extern void gsm_debug_words P((char *name, int, int, word *)); | |
235 extern void gsm_debug_longwords P((char *name, int, int, longword *)); | |
236 extern void gsm_debug_longword P((char *name, longword)); | |
237 extern void gsm_debug_word P((char *name, word)); | |
238 | |
239 #endif /* !NDEBUG */ | |
240 | |
241 #include "unproto.h" | |
242 | |
243 #endif /* PRIVATE_H */ |