FreeCalypso > hg > gsm-codec-lib
comparison dev/s2u-regen.c @ 227:a5200ad12d58
dev/s2u-regen.c: new approach
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 23 Apr 2023 16:53:32 +0000 |
| parents | 84d22eb72196 |
| children |
comparison
equal
deleted
inserted
replaced
| 226:84d22eb72196 | 227:a5200ad12d58 |
|---|---|
| 1 /* | 1 /* |
| 2 * This program regenerates a G.711 mu-law encoding table equivalent to the | 2 * This program generates a G.711 mu-law encoding table of the same form |
| 3 * s2u[] table in the toast_ulaw.c module in libgsm/toast; the intent is | 3 * as the s2u[] table in the toast_ulaw.c module in libgsm/toast, i.e., |
| 4 * to check that table for correctness. The "engine" function that does | 4 * an encoding table that takes only the upper 13 bits of the linear PCM |
| 5 * the computation is based on ulaw_compress() from ITU-T G.191 STL. | 5 * sample to be encoded, even though canonical mu-law encoding requires |
| 6 * 14-bit input. The 13-bit table constructed by this program is computed | |
| 7 * as if the lsb of the "proper" 14-bit input is always zero, like it is | |
| 8 * expected to be when the linear PCM samples came from the output of a | |
| 9 * GSM speech decoder. | |
| 10 * | |
| 11 * The "engine" function that does the computation is based on ulaw_compress() | |
| 12 * from ITU-T G.191 STL. | |
| 6 */ | 13 */ |
| 7 | 14 |
| 8 #include <stdio.h> | 15 #include <stdio.h> |
| 9 #include <stdlib.h> | 16 #include <stdlib.h> |
| 10 | 17 |
| 18 short low_nibble; /* low nibble of log companded sample */ | 25 short low_nibble; /* low nibble of log companded sample */ |
| 19 short high_nibble; /* high nibble of log companded sample */ | 26 short high_nibble; /* high nibble of log companded sample */ |
| 20 unsigned output; | 27 unsigned output; |
| 21 | 28 |
| 22 /* -------------------------------------------------------------------- */ | 29 /* -------------------------------------------------------------------- */ |
| 23 /* Change from 14 bit left justified to 14 bit right justified */ | 30 /* Input is 14-bit right-justified in this version */ |
| 24 /* Compute absolute value; adjust for easy processing */ | 31 /* Compute absolute value; adjust for easy processing */ |
| 25 /* -------------------------------------------------------------------- */ | 32 /* -------------------------------------------------------------------- */ |
| 26 absno = input >= 4096 /* compute 1's complement in case of */ | 33 absno = input >= 0x2000 /* compute 1's complement in case of */ |
| 27 ? ((~input & 4095) << 1) + 33 /* negative samples */ | 34 ? (~input & 0x1FFF) + 33 /* negative samples */ |
| 28 : (input << 1) + 33; /* NB: 33 is the difference value */ | 35 : input + 33; /* NB: 33 is the difference value */ |
| 29 /* between the thresholds for */ | 36 /* between the thresholds for */ |
| 30 /* A-law and u-law. */ | 37 /* A-law and u-law. */ |
| 31 if (absno > (0x1FFF)) /* limitation to "absno" < 8192 */ | 38 if (absno > (0x1FFF)) /* limitation to "absno" < 8192 */ |
| 32 absno = (0x1FFF); | 39 absno = (0x1FFF); |
| 33 | 40 |
| 49 | 56 |
| 50 /* Joining the high-nibble and the low-nibble of the log PCM sample */ | 57 /* Joining the high-nibble and the low-nibble of the log PCM sample */ |
| 51 output = (high_nibble << 4) | low_nibble; | 58 output = (high_nibble << 4) | low_nibble; |
| 52 | 59 |
| 53 /* Add sign bit */ | 60 /* Add sign bit */ |
| 54 if (input < 4096) | 61 if (input < 0x2000) |
| 55 output = output | (0x0080); | 62 output = output | (0x0080); |
| 56 | 63 |
| 57 return output; | 64 return output; |
| 58 } | 65 } |
| 59 | 66 |
| 61 char **argv; | 68 char **argv; |
| 62 { | 69 { |
| 63 unsigned input, output; | 70 unsigned input, output; |
| 64 | 71 |
| 65 for (input = 0; input < 8192; input++) { | 72 for (input = 0; input < 8192; input++) { |
| 66 output = ulaw_compress(input); | 73 output = ulaw_compress(input << 1); |
| 67 printf("%04o,", output); | 74 printf("%04o,", output); |
| 68 if ((input % 15) == 14 || input == 8191) | 75 if ((input % 15) == 14 || input == 8191) |
| 69 putchar('\n'); | 76 putchar('\n'); |
| 70 } | 77 } |
| 71 exit(0); | 78 exit(0); |
