作为一个小型实验音乐作品,我试图用标准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);
Run Code Online (Sandbox Code Playgroud)
不起作用的16位代码:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
pcm=out*256;
fwrite(&pcm,2,1,fo);
Run Code Online (Sandbox Code Playgroud)
我可能只是想遗漏一些明显的东西,但是我已经尝试了好几个小时。提前致谢!
我想看看 Audacity 中的波形会给你一些线索。
您检查过吗:
我不知道 PCM 的预期格式是什么,但这些都可能是该问题的候选格式。