作为一个小型实验音乐作品,我正在尝试用标准 C 编写一首歌曲。代码输出一个原始 PCM 文件,可以将其导入 Audacity。目前一切都按预期工作,但我在尝试将每个样本写入 16 位而不是我正在使用的当前 8 位时遇到问题。
在写入之前,当前样本被计算为浮点数,其边界几乎保持在有符号 8 位整数的范围内。然后在对下一个样本重复该过程之前将其写入为 8 位整数。这可以正常工作并且可以正常播放。当我尝试将其写为 16 位原始 PCM 文件时会出现问题 - 我将浮点数乘以 256 并将结果复制到一个整数,然后我使用 fwrite 写入生成的 16 位整数。这在导入时没有给出预期的结果,导致我所期望的高度失真的版本。
我在下面添加了有效代码,因为问题只发生在写作阶段。
工作8位代码:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
putc(out,fo);
不工作的 16 位代码:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
pcm=out*256;
fwrite(&pcm,2,1,fo);
我可能只是遗漏了一些明显的东西,但我一直在努力解决几个小时。提前致谢!