FreeCalypso > hg > gsm-codec-lib
view dev/u2s-regen.c @ 604:54f0f1b74c25
libgsmhr1 TFO: require BFI=0 and SID=0 for homing
In order for a received frame to be recognized as DHF, we need
not only the correct bit pattern, but also BFI=0 and SID=0.
The BFI=0 requirement should be obvious, while the SID=0 requirement
is needed only for HR codec. With FR and EFR, SID classification
comes from the payload bits and no separate check is needed -
but in HR we get an out-of-band SID ternary flag. When SID=1,
no payload bits are used at all; when SID=2, we use only the first
33 bits of the payload. Therefore, it is proper to conditionalize
DHF acceptance on SID=0.
We already implemented this logic in the just finished full decoder;
now bring TFO code into agreement.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 04 Dec 2025 19:40:35 +0000 |
| parents | 20750ffb1c3e |
| children |
line wrap: on
line source
/* * This program generates a G.711 mu-law decoding table of the same form * as the u2s[] table in the toast_ulaw.c module in libgsm/toast; the intent * is to replace that incorrect table with a corrected one. The "engine" * function that does the computation is based on ulaw_expand() from ITU-T * G.191 STL. */ #include <stdio.h> #include <stdlib.h> static unsigned ulaw_expand (input) unsigned input; { short segment; /* segment (Table 2/G711, column 1) */ short mantissa; /* low nibble of log companded sample */ short exponent; /* high nibble of log companded sample */ short sign; /* sign of output sample */ short step; short output; sign = input < (0x0080) /* sign-bit = 1 for positiv values */ ? -1 : 1; mantissa = ~input; /* 1's complement of input value */ exponent = (mantissa >> 4) & (0x0007); /* extract exponent */ segment = exponent + 1; /* compute segment number */ mantissa = mantissa & (0x000F); /* extract mantissa */ /* Compute Quantized Sample (14 bit left justified!) */ step = (4) << segment; /* position of the LSB */ /* = 1 quantization step) */ output = sign * /* sign */ (((0x0080) << exponent) /* '1', preceding the mantissa */ +step * mantissa /* left shift of mantissa */ + step / 2 /* 1/2 quantization step */ - 4 * 33); return output & 0xFFFF; } main(argc, argv) char **argv; { unsigned input, output; for (input = 0; input < 256; input++) { output = ulaw_expand(input); printf("%6u,", output); if ((input & 7) == 7) putchar('\n'); } exit(0); }
