c - G.711 实现 A 律

标签 c standards codec standards-compliance

我正在实现 ITU-T G.711 标准,我决定从 G.191 中的引用代码开始。

在 A-law 压缩上运行一些测试让我怀疑算法的正确性。

根据G.711,输入范围0-63应该位于第一段,步长为2。 G.191 中的示例代码将此范围映射如下:

  • 在段 0 上从 0 到 15,步长为 1
  • 在段 1 上从 16 到 31,步长为 1
  • 在段 2 上从 32 到 63,步长为 2

在将输出与表中的值进行比较时,我们不仅得到 1 段偏移量,而且范围也减半,这样压缩的 FF 对应于统一的 2047。

我应该如何操作才能获得符合 G.711 标准的编解码器?

最佳答案

代码与标准相称。

首先请注意,标准假定 13 位输入(但始终量化 lsb),代码假定 16 位,并立即丢弃除 12 msb 之外的所有输入。所以在 12 位术语中,G.711 中的表 1a 实际上是在说:

  • 第 1 段:输入值 0 -> 31(步长 1)
  • 第 2 段:输入值 32 -> 63(步长 2)
  • ...

唯一剩下的差异是第一段显然在代码中一分为二。不是真的;请注意,这些段与指数不同;第 1 段包含指数 000001。该代码专门处理指数。

关于c - G.711 实现 A 律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663423/

相关文章:

linux - OpenCV VideoWriter 打不开

encoding - 如何在使用 ffmpeg 进行实时 rtmp 发布期间自适应地将编码比特率更改为带宽?

c - dup() 和缓存刷新

C++ 标准委员会 "reflector"邮件列表

c++ - 为什么 C++11 标准中的 INVOKE 工具引用数据成员?

html - 大型电子商务网站 : Is it time for HTML5?

java - 如何在android中处理音频(.3gp)文件

c - C 中的指针,来自下面的代码

c - 如何扫描C程序中的行而不是从文件中

c++ - 异构数组实现