将 8 位无符号 PCM 转换为 8 位有符号 PCM

Posted

技术标签:

【中文标题】将 8 位无符号 PCM 转换为 8 位有符号 PCM【英文标题】:Converting 8bit unsigned PCM into 8bit signed PCM 【发布时间】:2011-07-18 18:31:04 【问题描述】:

如何将无符号 8 位 PCM 流 (0-255) 转换为有符号 8 位 PCM 流 (-128-127)。是否像从每个无符号字节中减去 128 使 0 变为 -128 而 255 变为 127 一样简单?还是更复杂? 谢谢!

【问题讨论】:

也许你应该添加你想使用的编程语言的标签来解决这个问题。 【参考方案1】:

你为什么不试试呢? 在我看来应该足够了,但我不知道你使用的是什么语言。

使用有符号和无符号整数/字符时,请记住负值的内部表示是二进制补码。 最安全的方法是计算 signed int 大小以避免溢出。

【讨论】:

我正在查看一些我没有编写的代码,它只是为了将无符号转换为有符号而做一些奇怪的事情。事实上,它的作用如下:“signed char result = ((signed char) (x + 128)) * 257;” (C 代码)。变量“x”是“unsigned char”类型,包含要转换的样本。我根本没有得到这个代码。 * 257 来自哪里?但它有效!? 与 257 相乘然后钳制为 char 大小就像与 1 相乘一样,所以它应该可以工作,但您可以将 257 排除在外。也许最初的程序员想要缩放 0-1 范围并且遇到了问题,但谁知道呢? 是的,似乎省略 * 257 并没有改变任何东西。所以我希望可以删除它而不破坏任何东西......也许这是一些古老的编译器错误的解决方法!? 正如我已经说过的那样,也许程序员最初想用 256 缩放 [0.0, 1.0] 区间,这将导致该区间的正确结果,但在您提供的代码中它将返回 0。也许然后他摆弄了这个值,直到 257 计算出来,但我们只能猜测。 好的,谢谢。所以无论如何,答案就是从无符号值中减去 128 一样简单!【参考方案2】:

对于您在评论中发布的代码,减去 128 将反转之前的操作并为您提供签名数据。

【讨论】:

以上是关于将 8 位无符号 PCM 转换为 8 位有符号 PCM的主要内容,如果未能解决你的问题,请参考以下文章

如何使用缩放有效地将 16 位无符号短转换为 8 位无符号字符?

Java - 将 16 位有符号 pcm 音频数据数组转换为双精度数组

将 32 位有符号整数转换为 24 位有符号音频数据

如何在 AVX2 中将 32 位无符号整数转换为 16 位无符号整数?

Python:如何将 32 位有符号长整数转换为 7 位整数

8位无符号整数点分式版本