欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[小程序] 用于 G.711a 编码和解码的 PCM 音频压缩 - 压缩后

最编程 2024-05-02 22:26:31
...

S 0000 001w xyz'a

s001 wxyz

S 0000 01wx yz'ab

s010 wxyz

S 0000 1wxy z'abc

s011 wxyz

S 0001 wxyz 'abcd

s100 wxyz

S 001w xyz'a bcde

s101 wxyz

S 01wx yz'ab cdef

s110 wxyz

S 1wxy z'abc defg

s111 wxyz

压缩方式如上,原始输入均为13位音频数据,其中S为符号位代表正、负,'符号之后的数据再压缩过程中被舍弃,仅保留wxyz位置上的数据。

       

压缩后的格式很像二进制科学技术法形式:

S、2的xxx次方、wxyz数据

符号位与偶数位取反

  1. unsigned char linear2alaw(short pcm_val)    /* 2's complement (16-bit range) */  
  2. {  
  3.     short     mask;  
  4.     short     seg;  
  5.     unsigned char   aval;  
  6.  
  7.     if (pcm_val >= 0) {  
  8.         mask = 0xD5;        /* sign (7th) bit = 1 */  
  9.     } else {  
  10.         mask = 0x55;        /* sign bit = 0 */  
  11.         pcm_val = -pcm_val - 8;  
  12.     }  
  13.  
  14.     /* Convert the scaled magnitude to segment number. */  
  15.     seg = search(pcm_val, seg_end, 8);  
  16.  
  17.     /* Combine the sign, segment, and quantization bits. */  
  18.  
  19.     if (seg >= 8)        /* out of range, return maximum value. */  
  20.         return (0x7F ^ mask);  
  21.     else {  
  22.         aval = seg << SEG_SHIFT;  
  23.         if (seg < 2)  
  24.             aval |= (pcm_val >> 4) & QUANT_MASK;  
  25.         else  
  26.             aval |= (pcm_val >> (seg + 3)) & QUANT_MASK;  
  27.         return (aval ^ mask);  
  28.     }  
  29. }  

主要通过“<<”“>>”“|”“^”等位运算实现编码过程。 

参考资料:

1.G.711编码原理及代码

https://www.2cto.com/kf/201504/390076.html

推荐阅读