FreeCalypso > hg > gsm-codec-lib
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 |
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 } |