作为一个小型实验性音乐作品,我试图用标准C编写一首歌曲。代码输出一个可导入Audacity的原始PCM文件。目前一切正常,但我在尝试将每个采样写入16位时遇到问题,而不是当前使用的8位。编写16位原始PCM文件时出现问题
直到被写入的点,当前样本计算为一个浮点数,并且其边界几乎保留在有符号的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);
我可能只是缺少明显的东西,但我一直在努力工作吧用了几个小时。提前致谢!
是pcm an int16_t? – RWS 2010-07-24 14:41:52
嗯...我认为8位WAV文件应该使用*无符号*样本。 – 2010-07-24 14:43:14
你需要显示'pcm'的声明。 – caf 2010-07-25 03:59:40