【问题标题】:Converting a 8 bit PCM to 16 bit PCM将 8 位 PCM 转换为 16 位 PCM
【发布时间】:2014-08-18 10:53:09
【问题描述】:

this question开始,让我了解了如何解交织16位PCM数据的左右声道。

我现在的问题是,如何将 8 位 PCM 解交错并“拉伸”成 16 位值

【问题讨论】:

  • 考虑到 8 位左声道交错,8 位右声道重复,关于非交错你需要了解什么?如果你想“拉伸”它,一种粗略的方法是乘以 256(即将字节视为 16 位数据中的 ms/高字节,并带有“0”ls/低字节。)如果你想尝试某种平滑 - 这是一个很大的问题。

标签: c++ audio pcm


【解决方案1】:

16 位 PCM 具有基本相同的数据位和在最低有效位侧的附加位,以指定值并增加准确性和细节。那么8位PCM为typically无符号值,中心点为0x80,16位(也适用于更高位数)PCM为有符号整数,所以转换公式为:

UINT8 sample8 = ...;
INT16 sample16 = (INT16) (sample8 - 0x80) << 8;

【讨论】:

  • 转移是有效的,但是缩放值以使 255 映射到 32767 而不是 32512 是否有意义? (反之,将 -128 钳位到 -127,使其不会从 -33025 到 32511 下溢)
  • @DwayneRobinson:我可能在这里弄错了,但据我所知,满量程 -1.0/+1.0 分别对应于 -0x7F/+0x7F 和 -0x7FFF/+0x7FFF。对此已有规范性定义。因此,简单的上移甚至不应该处理MIN_INT8MIN_INT16 值。如果你要钳制(比移位更复杂的位数学),我有必要钳制这些不对称值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多