u-Law to Signed linear conversion More...

Go to the source code of this file.
Defines | |
| #define | AST_LIN2MU_LOOKUP(mag) __ast_lin2mu[((mag) + AST_ULAW_STEP / 2) >> AST_ULAW_BIT_LOSS] |
| #define | AST_MULAW(a) (__ast_mulaw[(a)]) |
| #define | AST_ULAW_BIT_LOSS 3 |
| #define | AST_ULAW_SIGN_BIT 0x80 |
| #define | AST_ULAW_STEP (1 << AST_ULAW_BIT_LOSS) |
| #define | AST_ULAW_TAB_SIZE (32768 / AST_ULAW_STEP + 1) |
Functions | |
| static unsigned char | AST_LIN2MU (short sample) |
| static void | ast_ulaw_get_sign_mag (short sample, unsigned *sign, unsigned *mag) |
| convert signed linear sample to sign-magnitude pair for u-Law | |
| void | ast_ulaw_init (void) |
| Set up mu-law conversion table. | |
Variables | |
| unsigned char | __ast_lin2mu [AST_ULAW_TAB_SIZE] |
| converts signed linear to mulaw | |
| short | __ast_mulaw [256] |
u-Law to Signed linear conversion
Definition in file ulaw.h.
| #define AST_LIN2MU_LOOKUP | ( | mag | ) | __ast_lin2mu[((mag) + AST_ULAW_STEP / 2) >> AST_ULAW_BIT_LOSS] |
Definition at line 53 of file ulaw.h.
Referenced by AST_LIN2MU(), and ast_ulaw_init().
| #define AST_MULAW | ( | a | ) | (__ast_mulaw[(a)]) |
Definition at line 85 of file ulaw.h.
Referenced by ast_dsp_process(), ast_ulaw_init(), calc_energy(), fill_rxgain(), fill_txgain(), load_module(), tdd_feed(), ulawtolin(), and ulawtolin_framein().
| #define AST_ULAW_SIGN_BIT 0x80 |
Definition at line 35 of file ulaw.h.
Referenced by ast_ulaw_get_sign_mag().
| #define AST_ULAW_STEP (1 << AST_ULAW_BIT_LOSS) |
Definition at line 33 of file ulaw.h.
Referenced by ast_ulaw_init().
| static unsigned char AST_LIN2MU | ( | short | sample | ) | [inline, static] |
Definition at line 77 of file ulaw.h.
References AST_LIN2MU_LOOKUP, and ast_ulaw_get_sign_mag().
Referenced by ast_dsp_process(), ast_ulaw_init(), fill_rxgain(), fill_txgain(), lintoulaw(), lintoulaw_framein(), load_module(), and make_tone_burst().
00078 { 00079 unsigned mag, sign; 00080 ast_ulaw_get_sign_mag(sample, &sign, &mag); 00081 return ~(sign | AST_LIN2MU_LOOKUP(mag)); 00082 }
| static void ast_ulaw_get_sign_mag | ( | short | sample, | |
| unsigned * | sign, | |||
| unsigned * | mag | |||
| ) | [inline, static] |
convert signed linear sample to sign-magnitude pair for u-Law
Definition at line 58 of file ulaw.h.
References AST_ULAW_SIGN_BIT.
Referenced by AST_LIN2MU(), and linear2ulaw().
00059 { 00060 /* It may look illogical to retrive the sign this way in both cases, 00061 * but this helps gcc eliminate the branch below and produces 00062 * faster code */ 00063 *sign = ((unsigned short)sample >> 8) & AST_ULAW_SIGN_BIT; 00064 #if defined(G711_REDUCED_BRANCHING) 00065 { 00066 unsigned dual_mag = (-sample << 16) | (unsigned short)sample; 00067 *mag = (dual_mag >> (*sign >> 3)) & 0xffffU; 00068 } 00069 #else 00070 if (sample < 0) 00071 *mag = -sample; 00072 else 00073 *mag = sample; 00074 #endif /* G711_REDUCED_BRANCHING */ 00075 }
| void ast_ulaw_init | ( | void | ) |
Set up mu-law conversion table.
To init the ulaw to slinear conversion stuff, this needs to be run.
Definition at line 175 of file ulaw.c.
References AST_LIN2MU(), AST_LIN2MU_LOOKUP, ast_log(), AST_MULAW, AST_ULAW_STEP, f, linear2ulaw(), LOG_NOTICE, LOG_WARNING, and ulaw2linear().
Referenced by load_module(), and main().
00176 { 00177 int i; 00178 00179 /* 00180 * Set up mu-law conversion table 00181 */ 00182 #ifndef G711_NEW_ALGORITHM 00183 for (i = 0;i < 256;i++) { 00184 short mu,e,f,y; 00185 static const short etab[]={0,132,396,924,1980,4092,8316,16764}; 00186 00187 mu = 255-i; 00188 e = (mu & 0x70)/16; 00189 f = mu & 0x0f; 00190 y = f * (1 << (e + 3)); 00191 y += etab[e]; 00192 if (mu & 0x80) y = -y; 00193 __ast_mulaw[i] = y; 00194 } 00195 /* set up the reverse (mu-law) conversion table */ 00196 for (i = -32768; i < 32768; i++) { 00197 __ast_lin2mu[((unsigned short)i) >> 2] = linear2ulaw(i); 00198 } 00199 #else 00200 00201 for (i = 0; i < 256; i++) { 00202 __ast_mulaw[i] = ulaw2linear(i); 00203 } 00204 /* set up the reverse (mu-law) conversion table */ 00205 for (i = 0; i <= 32768; i += AST_ULAW_STEP) { 00206 AST_LIN2MU_LOOKUP(i) = linear2ulaw(i, 0 /* half-cooked */); 00207 } 00208 #endif 00209 00210 #ifdef TEST_CODING_TABLES 00211 for (i = -32768; i < 32768; ++i) { 00212 #ifndef G711_NEW_ALGORITHM 00213 unsigned char e1 = linear2ulaw(i); 00214 #else 00215 unsigned char e1 = linear2ulaw(i, 1); 00216 #endif 00217 short d1 = ulaw2linear(e1); 00218 unsigned char e2 = AST_LIN2MU(i); 00219 short d2 = ulaw2linear(e2); 00220 short d3 = AST_MULAW(e1); 00221 00222 if (e1 != e2 || d1 != d3 || d2 != d3) { 00223 ast_log(LOG_WARNING, "u-Law coding tables test failed on %d: e1=%u, e2=%u, d1=%d, d2=%d\n", 00224 i, (unsigned)e1, (unsigned)e2, (int)d1, (int)d2); 00225 } 00226 } 00227 ast_log(LOG_NOTICE, "u-Law coding table test complete.\n"); 00228 #endif /* TEST_CODING_TABLES */ 00229 00230 #ifdef TEST_TANDEM_TRANSCODING 00231 /* tandem transcoding test */ 00232 for (i = -32768; i < 32768; ++i) { 00233 unsigned char e1 = AST_LIN2MU(i); 00234 short d1 = AST_MULAW(e1); 00235 unsigned char e2 = AST_LIN2MU(d1); 00236 short d2 = AST_MULAW(e2); 00237 unsigned char e3 = AST_LIN2MU(d2); 00238 short d3 = AST_MULAW(e3); 00239 00240 if (i < 0 && e1 == 0x7f && e2 == 0xff && e3 == 0xff) 00241 continue; /* known and normal negative 0 case */ 00242 00243 if (e1 != e2 || e2 != e3 || d1 != d2 || d2 != d3) { 00244 ast_log(LOG_WARNING, "u-Law tandem transcoding test failed on %d: e1=%u, e2=%u, d1=%d, d2=%d, d3=%d\n", 00245 i, (unsigned)e1, (unsigned)e2, (int)d1, (int)d2, (int)d3); 00246 } 00247 } 00248 ast_log(LOG_NOTICE, "u-Law tandem transcoding test complete.\n"); 00249 #endif /* TEST_TANDEM_TRANSCODING */ 00250 }
| unsigned char __ast_lin2mu[AST_ULAW_TAB_SIZE] |
| short __ast_mulaw[256] |
1.6.1