分享

ITU-g711程序源码

 望笑微 2012-03-21
  1. // ITU-g711程序源码    
  2. // 主要包括:    
  3. // 13比特线性码的U律编码解码。    
  4. // 13比特线性码的U律编码解码。    
  5. // U律和A律8位非线性吗之间的相互转换。    
  6.    
  7. #define SIGN_BIT    (0x80)      /* A-law 符号位  */    
  8. #define QUANT_MASK  (0xf)       /* 段内量化值域  */    
  9. #define NSEGS       (8)         /* A-law 段落号. */    
  10. #define SEG_SHIFT   (4)         /* 段落左移位量  */    
  11. #define SEG_MASK    (0x70)      /* 段落码区域.   */    
  12.    
  13. static short seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF};  //A律编码解码预制表    
  14. static short seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF,0x3FF, 0x7FF, 0xFFF, 0x1FFF}; //U律编码解码预制表    
  15.    
  16. unsigned char _u2a[128] = {         /* U律到A律转化编码表 */   
  17.     1,  1,  2,  2,  3,  3,  4,  4,   
  18.     5,  5,  6,  6,  7,  7,  8,  8,   
  19.     9,  10, 11, 12, 13, 14, 15, 16,   
  20.     17, 18, 19, 20, 21, 22, 23, 24,   
  21.     25, 27, 29, 31, 33, 34, 35, 36,   
  22.     37, 38, 39, 40, 41, 42, 43, 44,   
  23.     46, 48, 49, 50, 51, 52, 53, 54,   
  24.     55, 56, 57, 58, 59, 60, 61, 62,   
  25.     64, 65, 66, 67, 68, 69, 70, 71,   
  26.     72, 73, 74, 75, 76, 77, 78, 79,   
  27.     80, 82, 83, 84, 85, 86, 87, 88,   
  28.     89, 90, 91, 92, 93, 94, 95, 96,   
  29.     97, 98, 99, 100,    101,    102,    103,    104,   
  30.     105,    106,    107,    108,    109,    110,    111,    112,   
  31.     113,    114,    115,    116,    117,    118,    119,    120,   
  32.     121,    122,    123,    124,    125,    126,    127,    128};   
  33.    
  34. unsigned char _a2u[128] = {         /* A律到U律转化编码表 */   
  35.     1,  3,  5,  7,  9,  11, 13, 15,   
  36.     16, 17, 18, 19, 20, 21, 22, 23,   
  37.     24, 25, 26, 27, 28, 29, 30, 31,   
  38.     32, 32, 33, 33, 34, 34, 35, 35,   
  39.     36, 37, 38, 39, 40, 41, 42, 43,   
  40.     44, 45, 46, 47, 48, 48, 49, 49,   
  41.     50, 51, 52, 53, 54, 55, 56, 57,   
  42.     58, 59, 60, 61, 62, 63, 64, 64,   
  43.     65, 66, 67, 68, 69, 70, 71, 72,   
  44.     73, 74, 75, 76, 77, 78, 79, 80,   
  45.     80, 81, 82, 83, 84, 85, 86, 87,   
  46.     88, 89, 90, 91, 92, 93, 94, 95,   
  47.     96, 97, 98, 99, 100,    101,    102,    103,   
  48.     104,    105,    106,    107,    108,    109,    110,    111,   
  49.     112,    113,    114,    115,    116,    117,    118,    119,   
  50.     120,    121,    122,    123,    124,    125,    126,    127};   
  51. // 该子程序寻找段落码    
  52. static short search(    short       val,    short       *table, short       size)   
  53. {     
  54.     short       i;   
  55.     for (i = 0; i < size; i++)    
  56.     {   
  57.         if (val <= *table++)   
  58.         return (i);   
  59.     }   
  60.     return (size);   
  61. }   
  62.    
  63. /*  输入与输出码型对应表  
  64.  *  线性码输入              非线性码输出  
  65.  *  ----------------      --------------  
  66.  *  0000000wxyza            000wxyz  
  67.  *  0000001wxyza            001wxyz  
  68.  *  000001wxyzab            010wxyz  
  69.  *  00001wxyzabc            011wxyz  
  70.  *  0001wxyzabcd            100wxyz  
  71.  *  001wxyzabcde            101wxyz  
  72.  *  01wxyzabcdef            110wxyz  
  73.  *  1wxyzabcdefg            111wxyz  
  74.  */   
  75. //16bit 线性码编码为8比特A律非线性码    
  76. //输入 pcm_val--16比特线性码,输出8比特A律非线性码    
  77. unsigned char linear2alaw(short pcm_val)    /* 2's complement (16-bit range) */   
  78. {   
  79.     short       mask;   
  80.     short       seg;   
  81.     unsigned char   aval;   
  82.    
  83.     pcm_val = pcm_val >> 3;   
  84.    
  85.     if (pcm_val >= 0) {   
  86.         mask = 0xD5;        /* sign (7th) bit = 1 */   
  87.     } else {   
  88.         mask = 0x55;        /* sign bit = 0 */   
  89.         pcm_val = -pcm_val - 1;   
  90.     }   
  91.     seg = search(pcm_val, seg_aend, 8);  /* 按照输入绝对值求取段落号. */   
  92.     // 将求取的符号位, 段落号, 段内量化值组成一个8比特数输出/    
  93.     if (seg >= 8)  return (unsigned char) (0x7F ^ mask);   
  94.     else {   
  95.         aval = (unsigned char) seg << SEG_SHIFT;   
  96.         if (seg < 2)aval |= (pcm_val >> 1) & QUANT_MASK;   
  97.         else   
  98.             aval |= (pcm_val >> seg) & QUANT_MASK;   
  99.         return (aval ^ mask);   
  100.     }   
  101. }   
  102.    
  103. //8bitA律非线性码解码为16比特线性码编码    
  104. //输入8比特A律非线性码 ,输出pcm_val--16比特线性码    
  105. short alaw2linear(  unsigned char   a_val)   
  106. {   
  107.     short       t;   
  108.     short       seg;   
  109.     a_val ^= 0x55;   
  110.     t = (a_val & QUANT_MASK) << 4;   
  111.     seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;   
  112.     switch (seg) {   
  113.     case 0:   
  114.         t += 8;     break;   
  115.     case 1:   
  116.         t += 0x108;     break;   
  117.     default:   
  118.         t += 0x108;     t <<= seg - 1;   
  119.     }   
  120.     return ((a_val & SIGN_BIT) ? t : -t);   
  121. }   
  122.    
  123. #define BIAS        (0x84)      //   线性码偏移值    
  124. #define CLIP         8159       //   最大量化级数量    
  125.    
  126. /*  
  127. //16bit 线性码编码为8比特u律非线性码  
  128. //输入 pcm_val--16比特线性码,输出8比特u律非线性码  
  129.  *  线性码输入              非线性码输出  
  130.  *  ----------------      --------------  
  131.  *  00000001wxyza           000wxyz  
  132.  *  0000001wxyzab           001wxyz  
  133.  *  000001wxyzabc           010wxyz  
  134.  *  00001wxyzabcd           011wxyz  
  135.  *  0001wxyzabcde           100wxyz  
  136.  *  001wxyzabcdef           101wxyz  
  137.  *  01wxyzabcdefg           110wxyz  
  138.  *  1wxyzabcdefgh           111wxyz  
  139.  */   
  140. unsigned char linear2ulaw(  short pcm_val)  /* 16比特线性码 */   
  141. {   
  142.     short       mask;   
  143.     short       seg;   
  144.     unsigned char   uval;   
  145.    
  146.     /* Get the sign and the magnitude of the value. */   
  147.     pcm_val = pcm_val >> 2;   
  148.     if (pcm_val < 0)   
  149.     {       pcm_val = -pcm_val;     mask = 0x7F;    }    
  150.     else    
  151.     {       mask = 0xFF;    }   
  152.        
  153.     if ( pcm_val > CLIP ) pcm_val = CLIP;        /* 削波 */   
  154.     pcm_val += (BIAS >> 2);   
  155.    
  156.     /* Convert the scaled magnitude to segment number. */   
  157.     seg = search(pcm_val, seg_uend, 8);   
  158.     // 将求取的符号位, 段落号, 段内量化值组成一个8比特数输出/    
  159.     if (seg >= 8)           
  160.         return (unsigned char) (0x7F ^ mask);   
  161.     else {  uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF);   
  162.         return (uval ^ mask);   
  163.     }   
  164.    
  165. }   
  166. //8bit u律非线性码解码为16bits 线性码编码    
  167. //输入u_val 8比特u律非线性码 ,输出pcm_val--16比特线性码    
  168. short ulaw2linear(  unsigned char   u_val)   
  169. {   
  170.     short       t;   
  171.     u_val = ~u_val;   
  172.     t = ((u_val & QUANT_MASK) << 3) + BIAS;   
  173.     t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;   
  174.    
  175.     return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));   
  176. }   
  177.    
  178. /*按照A律到U律转化编码表进行A律到U律码型转换 */   
  179. unsigned char alaw2ulaw(    unsigned char   aval)   
  180. {   
  181.     aval &= 0xff;   
  182.     return (unsigned char) ((aval & 0x80) ? (0xFF ^ _a2u[aval ^ 0xD5]) :   
  183.         (0x7F ^ _a2u[aval ^ 0x55]));   
  184. }   
  185. /*按照U律到A律转化编码表进行U律到A律码型转换 */   
  186. unsigned char ulaw2alaw(    unsigned char   uval)   
  187. {   
  188.     uval &= 0xff;   
  189.     return (unsigned char) ((uval & 0x80) ? (0xD5 ^ (_u2a[0xFF ^ uval] - 1)) :   
  190.         (unsigned char) (0x55 ^ (_u2a[0x7F ^ uval] - 1)));   
  191. }   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多