我将pcm音频存储在字节数组中。每个样本为16位。我想使每个样本音频为8位。

谁能建议一个好的算法来做到这一点?

我没有提到比特率,因为我认为它对算法并不重要-对吗?

最佳答案

我现在不明白为什么仅取高字节是不够的,即丢弃每个样本的低8位。

当然,这假设样本是线性的;如果不是,那么您可能需要在删除位之前进行一些操作以使其线性化。

short sixteenBit = 0xfeed;
byte eightBit = sixteenBit >> 8;
// eightBit is now 0xfe.

正如AShelly在评论中所建议的那样,四舍五入可能是一个好主意,即如果我们要丢弃的字节大于其最大值的一半,则加1。
eightBit += eightBit < 0xff && ((sixteenBit & 0xff) > 0x80);

针对0xff的测试实现了钳位,因此我们不必冒将0添加到0xff并将其包装到0x00的风险。

10-01 15:20