所以您是说您告诉 SOX 将 16 位样本 WAV 文件作为 8 位样本文件读取?对 SOX 一无所知,我希望它将每个 16 位样本读取为两个 8 位样本...高位字节和低位字节如下:...HLHLHLHLHL...
为简单起见,我们将高位字节样本称为“A”样本。 “A”样本携带动态范围较小的原始声音,因为具有额外精度的低位字节已被切掉。
我们将低位字节样本称为“B 样本”。这些将是大致随机的并编码噪声。
因此,我们将原始声音(即“A”样本)的频率降低了一半。这是因为在每个“A”样本之间都有一个“B”样本,这将“A”样本的速率减半。 “B”样本为原始声音添加了噪音。所以我们会得到原始声音,降低一半,并带有噪音。
这是你听到的吗?
编辑 客人评论说目标是将 WAV 下变频为 8 位音频。阅读manpage for SoX,由于 sox_read(),SoX 似乎总是在内存中使用 32 位音频。将格式传递给它只会使它尝试从 该格式读取。
要在内存中进行下转换,请使用 sox.h 中的 SOX_SAMPLE_TO_SIGNED_8BIT 或 SOX_SAMPLE_TO_UNSIGNED_8BIT,即:
sox_format_t ft = sox_open_read("/file/blah.wav", NULL, NULL);
if( ft ) {
sox_ssample_t buffer[100];
sox_size_t amt = sox_read(ft, buffer, sizeof(buffer));
char 8bitsample = SOX_SAMPLE_TO_SIGNED_8BIT(buffer[0], ft->clips);
}
要输出下转换的文件,写入时使用 8 位格式,而不是读取时。