annotate dev/u2s-regen.c @ 301:019eed8b1948

doc/FR1-library-history: new article
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 15 Apr 2024 18:36:21 +0000
parents 20750ffb1c3e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
222
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
230
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
2 * This program generates a G.711 mu-law decoding table of the same form
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
3 * as the u2s[] table in the toast_ulaw.c module in libgsm/toast; the intent
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
4 * is to replace that incorrect table with a corrected one. The "engine"
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
5 * function that does the computation is based on ulaw_expand() from ITU-T
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
6 * G.191 STL.
222
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 */
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <stdio.h>
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdlib.h>
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 static unsigned
230
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
13 ulaw_expand (input)
222
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 unsigned input;
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 {
230
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
16 short segment; /* segment (Table 2/G711, column 1) */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
17 short mantissa; /* low nibble of log companded sample */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
18 short exponent; /* high nibble of log companded sample */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
19 short sign; /* sign of output sample */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
20 short step;
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
21 short output;
222
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22
230
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
23 sign = input < (0x0080) /* sign-bit = 1 for positiv values */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
24 ? -1 : 1;
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
25 mantissa = ~input; /* 1's complement of input value */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
26 exponent = (mantissa >> 4) & (0x0007); /* extract exponent */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
27 segment = exponent + 1; /* compute segment number */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
28 mantissa = mantissa & (0x000F); /* extract mantissa */
222
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29
230
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
30 /* Compute Quantized Sample (14 bit left justified!) */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
31 step = (4) << segment; /* position of the LSB */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
32 /* = 1 quantization step) */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
33 output = sign * /* sign */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
34 (((0x0080) << exponent) /* '1', preceding the mantissa */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
35 +step * mantissa /* left shift of mantissa */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
36 + step / 2 /* 1/2 quantization step */
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
37 - 4 * 33);
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
38 return output & 0xFFFF;
222
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 }
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 main(argc, argv)
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 char **argv;
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 {
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 unsigned input, output;
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45
224
b502321000aa dev: new program a2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 223
diff changeset
46 for (input = 0; input < 256; input++) {
230
20750ffb1c3e dev: new program u2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 225
diff changeset
47 output = ulaw_expand(input);
224
b502321000aa dev: new program a2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 223
diff changeset
48 printf("%6u,", output);
b502321000aa dev: new program a2s-regen
Mychaela Falconia <falcon@freecalypso.org>
parents: 223
diff changeset
49 if ((input & 7) == 7)
222
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 putchar('\n');
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 }
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 exit(0);
842136bbd0da dev: new program s2a-regen
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 }