FreeCalypso > hg > gsm-codec-lib
comparison doc/PCM8-conversions @ 236:4c7d0dc1eecb
doc/PCM8-conversions: finish encoding description
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 08 May 2023 03:28:40 +0000 |
parents | 0ee1a66c1846 |
children | e4a4bf11f37c |
comparison
equal
deleted
inserted
replaced
235:0ee1a66c1846 | 236:4c7d0dc1eecb |
---|---|
99 * Mu-law encoding is the real hair-raiser: if the input to the to-be-implemented | 99 * Mu-law encoding is the real hair-raiser: if the input to the to-be-implemented |
100 encoder has 14 or more bits (including the most practical problem of 16-bit | 100 encoder has 14 or more bits (including the most practical problem of 16-bit |
101 2's complement input), there are no less than 3 different ways to implement | 101 2's complement input), there are no less than 3 different ways to implement |
102 this encoder! | 102 this encoder! |
103 | 103 |
104 Let us now look at the 3 different ways of encoding a 14-bit or 16-bit 2's | |
105 complement linear PCM input to G.711 mu-law. In this analysis we shall use | |
106 14-bit notation, with 2's complement inputs contained in the domain | |
107 [-8192,8191]. The difference between the 3 identified ways of mapping from this | |
108 domain to mu-law have to do with boundaries between quantization intervals. | |
109 Tables 2a and 2b in the G.711 spec list all defined quantization intervals and | |
110 all decision values that mark boundaries between them; here is a digested form | |
111 of the beginning of the canonical quantization table for either side of zero: | |
112 | |
113 Quantization interval Quantized value | |
114 (range of magnitudes) (absolute) | |
115 --------------------------------------- | |
116 0-1 0 | |
117 1-3 2 | |
118 3-5 4 | |
119 ... | |
120 29-31 30 | |
121 31-35 33 | |
122 35-39 37 | |
123 ... | |
124 91-95 93 | |
125 95-103 99 | |
126 ... | |
127 | |
128 This canonical quantization table is defined in terms of absolute values, and | |
129 is therefore fully symmetric around zero. A careful look at the above table | |
130 raises a question: which quantization interval (and thus which PCMU octet | |
131 output) should be selected if the input value to the encoder has a magnitude | |
132 exactly equal to one of the threshold points, or decision values as they are | |
133 officially called? In other words, what should the encoder do if the magnitude | |
134 of the 14-bit input value equals 1, 3, 5, ..., 31, 35, 39 etc? The answer to | |
135 this question is where the 3 candidate mappings under our consideration differ: | |
136 | |
137 * The "compress" function of G.726 operating in mu-law mode selects the higher | |
138 (in absolute value) quantization interval at every decision value threshold, | |
139 on both sides of zero: see Table 15/G.726. PCMU octet 0x7F (meaning -0) will | |
140 never be emitted by this version, and an input sequence of -3, -2, -1, 0, 1, | |
141 2, 3 will map to quantized values -4, -2, -2, 0, 2, 2, 4. | |
142 | |
143 * The ulaw_compress() function in G.191 STL behaves like the G.726 version for | |
144 positive values, but selects the smaller-absolute-value quantization interval | |
145 for negative inputs. Given the same input sequence as above, the output will | |
146 correspond to quantized values -2, -2, -0, 0, 2, 2, 4. (Quantized value -0 | |
147 is PCMU octet 0x7F.) | |
148 | |
149 * The s2u[] table in toast_ulaw.c in libgsm source is flat-out wrong and should | |
150 not be used or considered further (and because those authors did not include | |
151 the source for whatever program they used to generate their broken s2u[] and | |
152 u2s[] tables, we have no way to really analyze them), but one CAN construct a | |
153 new table for the same function, using the upper 13 bits of 16-bit 2's | |
154 complement input to generate PCMU output - see our dev/s2u-regen.c program | |
155 and its output table in dev/s2u-regen.out. The resulting mapping is | |
156 "mirrored" around zero compared to G.191 STL ulaw_compress(): for the same | |
157 input sequence as in the previous two examples, the output will correspond to | |
158 quantized values -4, -2, -2, 0, 0, 2, 2. Just like the G.726 version, this | |
159 look-up table version will never emit PCMU octet 0x7F for -0. | |
160 | |
161 It is important to note that all GSM speech decoders produce 2's complement | |
162 outputs that are only 13 bits wide, not 14 - therefore, when the input to the | |
163 G.711 encoder comes from the output of a GSM speech decoder, the difference | |
164 between all 3 alternatives listed above is masked, with all 3 producing | |
165 identical output. | |
166 | |
167 For production software, our (Themyscira) recommendation is to use look-up | |
168 tables (dev/s2a-regen.out and dev/s2u-regen.out) for both A-law and mu-law | |
169 encoding, using the upper 12 bits from 16-bit 2's complement input for A-law | |
170 encoding and the upper 13 bits for mu-law encoding. |