summaryrefslogtreecommitdiffstats
path: root/baseline/source/adpcm_enc/adpcm_enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'baseline/source/adpcm_enc/adpcm_enc.c')
-rw-r--r--baseline/source/adpcm_enc/adpcm_enc.c758
1 files changed, 758 insertions, 0 deletions
diff --git a/baseline/source/adpcm_enc/adpcm_enc.c b/baseline/source/adpcm_enc/adpcm_enc.c
new file mode 100644
index 0000000..d9fb09a
--- /dev/null
+++ b/baseline/source/adpcm_enc/adpcm_enc.c
@@ -0,0 +1,758 @@
1/*
2
3 This program is part of the TACLeBench benchmark suite.
4 Version V 2.0
5
6 Name: adpcm_enc
7
8 Author: Sung-Soo Lim
9
10 Function: CCITT G.722 ADPCM (Adaptive Differential Pulse Code Modulation)
11 algorithm. 16khz sample rate data is stored in the array test_data[SIZE].
12 Results are stored in the array compressed[SIZE].
13 Execution time is determined by the constant SIZE (default value is 2000).
14
15
16 Source: C Algorithms for Real-Time DSP by P. M. Embree
17 and SNU-RT Benchmark Suite for Worst Case Timing Analysis
18 collected and modified by S.-S. Lim <sslim@archi.snu.ac.kr>
19
20 Original name: adpcm_encoder
21
22 Changes: no major functional changes
23
24 License: may be used, modified, and re-distributed freely, but the
25 SNU-RT Benchmark Suite must be acknowledged
26
27*/
28
29
30/* common sampling rate for sound cards on IBM/PC */
31
32#include "../extra.h"
33#define SAMPLE_RATE 11025
34
35#define PI 3141
36#define SIZE 3
37#define IN_END 4
38
39
40/*
41 Forward declaration of functions
42*/
43
44int adpcm_enc_encode( int, int );
45int adpcm_enc_filtez( int *bpl, int *dlt );
46void adpcm_enc_upzero( int dlt, int *dlti, int *bli );
47int adpcm_enc_filtep( int rlt1, int al1, int rlt2, int al2 );
48int adpcm_enc_quantl( int el, int detl );
49int adpcm_enc_logscl( int il, int nbl );
50int adpcm_enc_scalel( int nbl, int shift_constant );
51int adpcm_enc_uppol2( int al1, int al2, int plt, int plt1, int plt2 );
52int adpcm_enc_uppol1( int al1, int apl2, int plt, int plt1 );
53int adpcm_enc_logsch( int ih, int nbh );
54void adpcm_enc_reset();
55int adpcm_enc_fabs( int n );
56int adpcm_enc_cos( int n );
57int adpcm_enc_sin( int n );
58int adpcm_enc_abs( int n );
59void adpcm_enc_init(void);
60void adpcm_enc_main(void);
61int adpcm_enc_return(void);
62//int main(void);
63
64/*
65 Forward declaration of global variables
66*/
67
68int adpcm_enc_test_data[SIZE * 2], adpcm_enc_compressed[SIZE];
69
70
71/* G722 C code */
72
73/* variables for transimit quadrature mirror filter here */
74int adpcm_enc_tqmf[24];
75
76/* QMF filter coefficients:
77scaled by a factor of 4 compared to G722 CCITT recommendation */
78int adpcm_enc_h[24] = {
79 12, -44, -44, 212, 48, -624, 128, 1448,
80 -840, -3220, 3804, 15504, 15504, 3804, -3220, -840,
81 1448, 128, -624, 48, 212, -44, -44, 12
82};
83
84int adpcm_enc_xl, adpcm_enc_xh;
85
86/* variables for encoder (hi and lo) here */
87
88int adpcm_enc_il, adpcm_enc_szl, adpcm_enc_spl, adpcm_enc_sl, adpcm_enc_el;
89
90int adpcm_enc_qq4_code4_table[16] = {
91 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200,
92 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0
93};
94
95int adpcm_enc_qq5_code5_table[32] = {
96 -280, -280, -23352, -17560, -14120, -11664, -9752, -8184,
97 -6864, -5712, -4696, -3784, -2960, -2208, -1520, -880,
98 23352, 17560, 14120, 11664, 9752, 8184, 6864, 5712,
99 4696, 3784, 2960, 2208, 1520, 880, 280, -280
100};
101
102int adpcm_enc_qq6_code6_table[64] = {
103 -136, -136, -136, -136, -24808, -21904, -19008, -16704,
104-14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856,
105 -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576,
106 -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728,
107 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192,
108 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456,
109 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032,
110 1688, 1360, 1040, 728, 432, 136, -432, -136
111};
112
113int adpcm_enc_delay_bpl[6];
114
115int adpcm_enc_delay_dltx[6];
116
117int adpcm_enc_wl_code_table[16] = {
118 -60, 3042, 1198, 538, 334, 172, 58, -30,
119 3042, 1198, 538, 334, 172, 58, -30, -60
120};
121
122int adpcm_enc_ilb_table[32] = {
123 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383,
124 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834,
125 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371,
126 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008
127};
128
129int adpcm_enc_nbl; /* delay line */
130int adpcm_enc_al1, adpcm_enc_al2;
131int adpcm_enc_plt, adpcm_enc_plt1, adpcm_enc_plt2;
132int adpcm_enc_dlt;
133int adpcm_enc_rlt, adpcm_enc_rlt1, adpcm_enc_rlt2;
134
135/* decision levels - pre-multiplied by 8, 0 to indicate end */
136int adpcm_enc_decis_levl[30] = {
137 280, 576, 880, 1200, 1520, 1864, 2208, 2584,
138 2960, 3376, 3784, 4240, 4696, 5200, 5712, 6288,
139 6864, 7520, 8184, 8968, 9752, 10712, 11664, 12896,
140 14120, 15840, 17560, 20456, 23352, 32767
141};
142
143int adpcm_enc_detl;
144
145/* quantization table 31 long to make quantl look-up easier,
146last entry is for mil=30 case when wd is max */
147int adpcm_enc_quant26bt_pos[31] = {
148 61, 60, 59, 58, 57, 56, 55, 54,
149 53, 52, 51, 50, 49, 48, 47, 46,
150 45, 44, 43, 42, 41, 40, 39, 38,
151 37, 36, 35, 34, 33, 32, 32
152};
153
154/* quantization table 31 long to make quantl look-up easier,
155last entry is for mil=30 case when wd is max */
156int adpcm_enc_quant26bt_neg[31] = {
157 63, 62, 31, 30, 29, 28, 27, 26,
158 25, 24, 23, 22, 21, 20, 19, 18,
159 17, 16, 15, 14, 13, 12, 11, 10,
160 9, 8, 7, 6, 5, 4, 4
161};
162
163
164int adpcm_enc_deth;
165int adpcm_enc_sh; /* this comes from adaptive predictor */
166int adpcm_enc_eh;
167
168int adpcm_enc_qq2_code2_table[4] = {
169 -7408, -1616, 7408, 1616
170};
171
172int adpcm_enc_wh_code_table[4] = {
173 798, -214, 798, -214
174};
175
176
177int adpcm_enc_dh, adpcm_enc_ih;
178int adpcm_enc_nbh, adpcm_enc_szh;
179int adpcm_enc_sph, adpcm_enc_ph, adpcm_enc_yh;
180
181int adpcm_enc_delay_dhx[6];
182int adpcm_enc_delay_bph[6];
183
184int adpcm_enc_ah1, adpcm_enc_ah2;
185int adpcm_enc_ph1, adpcm_enc_ph2;
186int adpcm_enc_rh1, adpcm_enc_rh2;
187
188
189/* G722 encode function two ints in, one 8 bit output */
190
191/* put input samples in xin1 = first value, xin2 = second value */
192/* returns il and ih stored together */
193
194
195/* MAX: 1 */
196int adpcm_enc_abs( int n )
197{
198 int m;
199
200
201 if ( n >= 0 )
202 m = n;
203 else
204 m = -n;
205
206 return m;
207}
208
209
210/* MAX: 1 */
211int adpcm_enc_fabs( int n )
212{
213 int f;
214
215
216 if ( n >= 0 )
217 f = n;
218 else
219 f = -n;
220
221 return f;
222}
223
224
225int adpcm_enc_sin( int rad )
226{
227 int diff;
228 int app = 0;
229 int inc = 1;
230
231
232 /* MAX dependent on rad's value, say 50 */
233 _Pragma("loopbound min 0 max 0")
234 while ( rad > 2 * PI ) {
235 rad -= 2 * PI;
236 }
237
238 /* MAX dependent on rad's value, say 50 */
239 _Pragma("loopbound min 0 max 1999")
240 while ( rad < -2 * PI ) {
241 rad += 2 * PI;
242 }
243
244 diff = rad;
245 app = diff;
246 diff = (diff * (-(rad*rad))) / ((2 * inc) * (2 * inc + 1));
247 app = app + diff;
248 inc++;
249
250 /* REALLY: while(my_fabs(diff) >= 0.00001) { */
251 /* MAX: 1000 */
252 _Pragma("loopbound min 849 max 2424")
253 while ( adpcm_enc_fabs( diff ) >= 1 ) {
254 diff = (diff * (-(rad*rad))) / ((2 * inc) * (2 * inc + 1));
255 app = app + diff;
256 inc++;
257 }
258
259 return app;
260}
261
262
263int adpcm_enc_cos( int rad )
264{
265 return( adpcm_enc_sin( PI / 2 - rad ) );
266}
267
268
269/* MAX: 1 */
270int adpcm_enc_encode( int xin1, int xin2 )
271{
272 int i;
273 int *h_ptr, *tqmf_ptr, *tqmf_ptr1;
274 long int xa, xb;
275 int decis;
276
277
278 /* transmit quadrature mirror filters implemented here */
279 h_ptr = adpcm_enc_h;
280 tqmf_ptr = adpcm_enc_tqmf;
281 xa = (long)(*tqmf_ptr++) * (*h_ptr++);
282 xb = (long)(*tqmf_ptr++) * (*h_ptr++);
283
284 /* main multiply accumulate loop for samples and coefficients */
285 /* MAX: 10 */
286 _Pragma("loopbound min 10 max 10")
287 for ( i = 0; i < 10; i++ ) {
288 xa += (long)(*tqmf_ptr++) * (*h_ptr++);
289 xb += (long)(*tqmf_ptr++) * (*h_ptr++);
290 }
291
292 /* final mult/accumulate */
293 xa += (long)(*tqmf_ptr++) * (*h_ptr++);
294 xb += (long)(*tqmf_ptr) * (*h_ptr++);
295
296 /* update delay line tqmf */
297 tqmf_ptr1 = tqmf_ptr - 2;
298 /* MAX: 22 */
299 _Pragma("loopbound min 22 max 22")
300 for ( i = 0; i < 22; i++ ) {
301 *tqmf_ptr-- = *tqmf_ptr1--;
302 }
303
304 *tqmf_ptr-- = xin1;
305 *tqmf_ptr = xin2;
306
307 /* scale outputs */
308 adpcm_enc_xl = (xa + xb) >> 15;
309 adpcm_enc_xh = (xa - xb) >> 15;
310
311 /* end of quadrature mirror filter code */
312
313 /* starting with lower sub band encoder */
314
315 /* filtez - compute predictor output section - zero section */
316 adpcm_enc_szl = adpcm_enc_filtez( adpcm_enc_delay_bpl, adpcm_enc_delay_dltx );
317
318 /* filtep - compute predictor output signal (pole section) */
319 adpcm_enc_spl = adpcm_enc_filtep( adpcm_enc_rlt1, adpcm_enc_al1, adpcm_enc_rlt2, adpcm_enc_al2 );
320
321 /* compute the predictor output value in the lower sub_band encoder */
322 adpcm_enc_sl = adpcm_enc_szl + adpcm_enc_spl;
323 adpcm_enc_el = adpcm_enc_xl - adpcm_enc_sl;
324
325 /* quantl: quantize the difference signal */
326 adpcm_enc_il = adpcm_enc_quantl( adpcm_enc_el, adpcm_enc_detl );
327
328 /* invqxl: computes quantized difference signal */
329 /* for invqbl, truncate by 2 lsbs, so mode = 3 */
330 adpcm_enc_dlt = ( (long) adpcm_enc_detl * adpcm_enc_qq4_code4_table[adpcm_enc_il >> 2] ) >> 15;
331
332 /* logscl: updates logarithmic quant. scale factor in low sub band */
333 adpcm_enc_nbl = adpcm_enc_logscl( adpcm_enc_il, adpcm_enc_nbl );
334
335 /* scalel: compute the quantizer scale factor in the lower sub band */
336 /* calling parameters nbl and 8 (constant such that scalel can be scaleh) */
337 adpcm_enc_detl = adpcm_enc_scalel( adpcm_enc_nbl, 8 );
338
339 /* parrec - simple addition to compute recontructed signal for adaptive pred */
340 adpcm_enc_plt = adpcm_enc_dlt + adpcm_enc_szl;
341
342 /* upzero: update zero section predictor coefficients (sixth order)*/
343 /* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */
344 /* bpli (linear_buffer in which all six values are delayed */
345 /* return params: updated bpli, delayed dltx */
346 adpcm_enc_upzero( adpcm_enc_dlt, adpcm_enc_delay_dltx, adpcm_enc_delay_bpl );
347
348 /* uppol2- update second predictor coefficient apl2 and delay it as al2 */
349 /* calling parameters: al1, al2, plt, plt1, plt2 */
350 adpcm_enc_al2 = adpcm_enc_uppol2( adpcm_enc_al1, adpcm_enc_al2, adpcm_enc_plt, adpcm_enc_plt1, adpcm_enc_plt2 );
351
352 /* uppol1 :update first predictor coefficient apl1 and delay it as al1 */
353 /* calling parameters: al1, apl2, plt, plt1 */
354 adpcm_enc_al1 = adpcm_enc_uppol1( adpcm_enc_al1, adpcm_enc_al2, adpcm_enc_plt, adpcm_enc_plt1);
355
356 /* recons : compute recontructed signal for adaptive predictor */
357 adpcm_enc_rlt = adpcm_enc_sl + adpcm_enc_dlt;
358
359 /* done with lower sub_band encoder; now implement delays for next time*/
360 adpcm_enc_rlt2 = adpcm_enc_rlt1;
361 adpcm_enc_rlt1 = adpcm_enc_rlt;
362 adpcm_enc_plt2 = adpcm_enc_plt1;
363 adpcm_enc_plt1 = adpcm_enc_plt;
364
365 /* high band encode */
366
367 adpcm_enc_szh = adpcm_enc_filtez( adpcm_enc_delay_bph, adpcm_enc_delay_dhx );
368
369 adpcm_enc_sph = adpcm_enc_filtep( adpcm_enc_rh1, adpcm_enc_ah1, adpcm_enc_rh2, adpcm_enc_ah2 );
370
371 /* predic: sh = sph + szh */
372 adpcm_enc_sh = adpcm_enc_sph + adpcm_enc_szh;
373 /* subtra: eh = xh - sh */
374 adpcm_enc_eh = adpcm_enc_xh - adpcm_enc_sh;
375
376 /* quanth - quantization of difference signal for higher sub-band */
377 /* quanth: in-place for speed params: eh, deth (has init. value) */
378 if ( adpcm_enc_eh >= 0 )
379 adpcm_enc_ih = 3; /* 2,3 are pos codes */
380 else
381 adpcm_enc_ih = 1; /* 0,1 are neg codes */
382
383 decis = ( 564L * (long)adpcm_enc_deth ) >> 12L;
384 if ( adpcm_enc_abs( adpcm_enc_eh ) > decis )
385 adpcm_enc_ih--; /* mih = 2 case */
386
387 /* invqah: compute the quantized difference signal, higher sub-band*/
388 adpcm_enc_dh = ( (long)adpcm_enc_deth * adpcm_enc_qq2_code2_table[adpcm_enc_ih] ) >> 15L ;
389
390 /* logsch: update logarithmic quantizer scale factor in hi sub-band*/
391 adpcm_enc_nbh = adpcm_enc_logsch( adpcm_enc_ih, adpcm_enc_nbh );
392
393 /* note : scalel and scaleh use same code, different parameters */
394 adpcm_enc_deth = adpcm_enc_scalel( adpcm_enc_nbh, 10 );
395
396 /* parrec - add pole predictor output to quantized diff. signal */
397 adpcm_enc_ph = adpcm_enc_dh + adpcm_enc_szh;
398
399 /* upzero: update zero section predictor coefficients (sixth order) */
400 /* calling parameters: dh, dhi, bphi */
401 /* return params: updated bphi, delayed dhx */
402 adpcm_enc_upzero( adpcm_enc_dh, adpcm_enc_delay_dhx, adpcm_enc_delay_bph );
403
404 /* uppol2: update second predictor coef aph2 and delay as ah2 */
405 /* calling params: ah1, ah2, ph, ph1, ph2 */
406 adpcm_enc_ah2 = adpcm_enc_uppol2( adpcm_enc_ah1, adpcm_enc_ah2, adpcm_enc_ph, adpcm_enc_ph1, adpcm_enc_ph2 );
407
408 /* uppol1: update first predictor coef. aph2 and delay it as ah1 */
409 adpcm_enc_ah1 = adpcm_enc_uppol1( adpcm_enc_ah1, adpcm_enc_ah2, adpcm_enc_ph, adpcm_enc_ph1 );
410
411 /* recons for higher sub-band */
412 adpcm_enc_yh = adpcm_enc_sh + adpcm_enc_dh;
413
414 /* done with higher sub-band encoder, now Delay for next time */
415 adpcm_enc_rh2 = adpcm_enc_rh1;
416 adpcm_enc_rh1 = adpcm_enc_yh;
417 adpcm_enc_ph2 = adpcm_enc_ph1;
418 adpcm_enc_ph1 = adpcm_enc_ph;
419
420 /* multiplex ih and il to get signals together */
421 return( adpcm_enc_il | (adpcm_enc_ih << 6) );
422}
423
424
425/* filtez - compute predictor output signal (zero section) */
426/* input: bpl1-6 and dlt1-6, output: szl */
427int adpcm_enc_filtez( int *bpl, int *dlt )
428{
429 int i;
430 long int zl;
431
432
433 zl = (long)(*bpl++) * (*dlt++);
434
435 /* MAX: 5 */
436 _Pragma("loopbound min 5 max 5")
437 for ( i = 1; i < 6; i++ ) {
438 zl += (long)(*bpl++) * (*dlt++);
439 }
440
441 return( (int)(zl >> 14) ); /* x2 here */
442}
443
444
445/* filtep - compute predictor output signal (pole section) */
446/* input rlt1-2 and al1-2, output spl */
447int adpcm_enc_filtep( int rlt1, int al1, int rlt2, int al2 )
448{
449 long int pl, pl2;
450
451
452 pl = 2 * rlt1;
453 pl = (long) al1 * pl;
454 pl2 = 2 * rlt2;
455 pl += (long) al2 * pl2;
456
457 return( (int)(pl >> 15) );
458}
459
460
461/* quantl - quantize the difference signal in the lower sub-band */
462int adpcm_enc_quantl( int el, int detl )
463{
464 int ril, mil;
465 long int wd, decis;
466
467
468 /* abs of difference signal */
469 wd = adpcm_enc_abs( el );
470
471 /* determine mil based on decision levels and detl gain */
472 /* MAX: 30 */
473 _Pragma("loopbound min 1 max 30")
474 for ( mil = 0; mil < 30; mil++ ) {
475 decis = (adpcm_enc_decis_levl[mil] * (long)detl) >> 15L;
476 if ( wd <= decis )
477 break;
478 }
479
480 /* if mil=30 then wd is less than all decision levels */
481 if ( el >= 0 )
482 ril = adpcm_enc_quant26bt_pos[mil];
483 else
484 ril = adpcm_enc_quant26bt_neg[mil];
485
486 return( ril );
487}
488
489
490/* invqxl is either invqbl or invqal depending on parameters passed */
491/* returns dlt, code table is pre-multiplied by 8 */
492
493/* int invqxl(int il,int detl,int *code_table,int mode) */
494/* { */
495/* long int dlt; */
496/* dlt = (long)detl*code_table[il >> (mode-1)]; */
497/* return((int)(dlt >> 15)); */
498/* } */
499
500/* logscl - update log quantizer scale factor in lower sub-band */
501/* note that nbl is passed and returned */
502int adpcm_enc_logscl( int il, int nbl )
503{
504 long int wd;
505
506
507 wd = ((long)nbl * 127L) >> 7L; /* leak factor 127/128 */
508 nbl = (int)wd + adpcm_enc_wl_code_table[il >> 2];
509
510 if ( nbl < 0 )
511 nbl = 0;
512 if ( nbl > 18432 )
513 nbl = 18432;
514
515 return( nbl );
516}
517
518
519/* scalel: compute quantizer scale factor in lower or upper sub-band*/
520int adpcm_enc_scalel( int nbl, int shift_constant )
521{
522 int wd1, wd2, wd3;
523
524
525 wd1 = (nbl >> 6) & 31;
526 wd2 = nbl >> 11;
527 wd3 = adpcm_enc_ilb_table[wd1] >> (shift_constant + 1 - wd2);
528
529 return( wd3 << 3 );
530}
531
532
533/* upzero - inputs: dlt, dlti[0-5], bli[0-5], outputs: updated bli[0-5] */
534/* also implements delay of bli and update of dlti from dlt */
535void adpcm_enc_upzero( int dlt, int *dlti, int *bli )
536{
537 int i, wd2, wd3;
538
539
540 /*if dlt is zero, then no sum into bli */
541 if ( dlt == 0 ) {
542 _Pragma("loopbound min 6 max 6")
543 for ( i = 0; i < 6; i++ ) {
544 bli[i] = (int)((255L * bli[i]) >> 8L); /* leak factor of 255/256 */
545 }
546
547 } else {
548 _Pragma("loopbound min 6 max 6")
549 for ( i = 0; i < 6; i++ ) {
550 if ( (long)dlt * dlti[i] >= 0 )
551 wd2 = 128;
552 else
553 wd2 = -128;
554
555 wd3 = (int)((255L * bli[i]) >> 8L); /* leak factor of 255/256 */
556 bli[i] = wd2 + wd3;
557 }
558
559 }
560
561 /* implement delay line for dlt */
562 dlti[5] = dlti[4];
563 dlti[4] = dlti[3];
564 dlti[3] = dlti[2];
565 dlti[1] = dlti[0];
566 dlti[0] = dlt;
567
568 return;
569}
570
571
572/* uppol2 - update second predictor coefficient (pole section) */
573/* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */
574int adpcm_enc_uppol2( int al1, int al2, int plt, int plt1, int plt2 )
575{
576 long int wd2, wd4;
577 int apl2;
578
579
580 wd2 = 4L * (long)al1;
581 if ( (long)plt * plt1 >= 0L )
582 wd2 = -wd2; /* check same sign */
583 wd2 = wd2 >> 7; /* gain of 1/128 */
584
585 if ( (long)plt * plt2 >= 0L ) {
586 wd4 = wd2 + 128; /* same sign case */
587 } else {
588 wd4 = wd2 - 128;
589 }
590 apl2 = wd4 + (127L*(long)al2 >> 7L); /* leak factor of 127/128 */
591
592 /* apl2 is limited to +-.75 */
593 if ( apl2 > 12288 )
594 apl2 = 12288;
595 if ( apl2 < -12288 )
596 apl2 = -12288;
597
598 return( apl2 );
599}
600
601
602/* uppol1 - update first predictor coefficient (pole section) */
603/* inputs: al1, apl2, plt, plt1. outputs: apl1 */
604int adpcm_enc_uppol1( int al1, int apl2, int plt, int plt1 )
605{
606 long int wd2;
607 int wd3, apl1;
608
609
610 wd2 = ((long)al1 * 255L) >> 8L; /* leak factor of 255/256 */
611 if ( (long)plt * plt1 >= 0L ) {
612 apl1 = (int)wd2 + 192; /* same sign case */
613 } else {
614 apl1 = (int)wd2 - 192;
615 }
616
617 /* note: wd3= .9375-.75 is always positive */
618 wd3 = 15360 - apl2; /* limit value */
619 if ( apl1 > wd3 )
620 apl1 = wd3;
621 if ( apl1 < -wd3 )
622 apl1 = -wd3;
623
624 return( apl1 );
625}
626
627
628/* INVQAH: inverse adaptive quantizer for the higher sub-band */
629/* returns dh, code table is pre-multiplied by 8 */
630/* int invqah(int ih,int deth) */
631/* { */
632/* long int rdh; */
633/* rdh = ((long)deth*qq2_code2_table[ih]) >> 15L ; */
634/* return((int)(rdh )); */
635/* } */
636
637
638/* logsch - update log quantizer scale factor in higher sub-band */
639/* note that nbh is passed and returned */
640int adpcm_enc_logsch( int ih, int nbh )
641{
642 int wd;
643
644
645 wd = ((long)nbh * 127L) >> 7L; /* leak factor 127/128 */
646 nbh = wd + adpcm_enc_wh_code_table[ih];
647
648 if ( nbh < 0 )
649 nbh = 0;
650 if ( nbh > 22528 )
651 nbh = 22528;
652
653 return( nbh );
654}
655
656
657/*
658 Initialization- and return-value-related functions
659*/
660
661/* clear all storage locations */
662
663void adpcm_enc_reset(void)
664{
665 int i;
666
667 adpcm_enc_detl = 32; /* reset to min scale factor */
668 adpcm_enc_deth = 8;
669 adpcm_enc_nbl = adpcm_enc_al1 = adpcm_enc_al2 = adpcm_enc_plt1 = adpcm_enc_plt2 = adpcm_enc_rlt1 = adpcm_enc_rlt2 = 0;
670 adpcm_enc_nbh = adpcm_enc_ah1 = adpcm_enc_ah2 = adpcm_enc_ph1 = adpcm_enc_ph2 = adpcm_enc_rh1 = adpcm_enc_rh2 = 0;
671
672 _Pragma("loopbound min 6 max 6")
673 for ( i = 0; i < 6; i++) {
674 adpcm_enc_delay_dltx[i] = 0;
675 adpcm_enc_delay_dhx[i] = 0;
676 }
677
678 _Pragma("loopbound min 6 max 6")
679 for ( i = 0; i < 6; i++ ) {
680 adpcm_enc_delay_bpl[i] = 0;
681 adpcm_enc_delay_bph[i] = 0;
682 }
683
684 _Pragma("loopbound min 23 max 23")
685 for ( i = 0; i < 23; i++ ) {
686 adpcm_enc_tqmf[i] = 0;
687 }
688
689 return;
690}
691
692
693void adpcm_enc_init(void)
694{
695 int i, j, f;
696 volatile int x = 0;
697
698 /* reset, initialize required memory */
699 adpcm_enc_reset();
700
701 /* read in amplitude and frequency for test data */
702 j = 10;
703 f = 2000;
704
705 /* 16 KHz sample rate */
706 /* XXmain_0, MAX: 2 */
707 /* Since the number of times we loop in my_sin depends on the argument we
708 add the fact: xxmain_0:[]: */
709 _Pragma("loopbound min 3 max 3")
710 for ( i = 0 ; i < SIZE ; i++) {
711 adpcm_enc_test_data[i] = (int) j * adpcm_enc_cos( f * PI * i );
712
713 /* avoid constant-propagation optimizations */
714 adpcm_enc_test_data[i] += x;
715 }
716}
717
718
719int adpcm_enc_return(void)
720{
721 int i;
722 int check_sum = 0;
723
724 for ( i = 0 ; i < IN_END ; i += 2 ) {
725 check_sum += adpcm_enc_compressed[i/2];
726 }
727
728 return check_sum != 385;
729}
730
731
732/*
733 Main functions
734*/
735
736void _Pragma( "entrypoint" ) adpcm_enc_main(void)
737{
738 int i;
739 /* MAX: 2 */
740 _Pragma("loopbound min 2 max 2")
741 for ( i = 0 ; i < IN_END ; i += 2 ) {
742 adpcm_enc_compressed[i/2] = adpcm_enc_encode( adpcm_enc_test_data[i], adpcm_enc_test_data[i+1] );
743 }
744
745}
746
747int main(int argc, char **argv)
748{
749 SET_UP
750 for(jobsComplete=-1; jobsComplete<maxJobs; jobsComplete++){
751 START_LOOP
752 adpcm_enc_init();
753 adpcm_enc_main();
754 STOP_LOOP
755 }
756 WRITE_TO_FILE
757 return adpcm_enc_return();
758}