作为一个小型实验音乐作品,我试图用标准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);
我可能只是想念一些明显的东西,但是我已经尝试了好几个小时。提前致谢!
最佳答案
我看不到代码中到底有什么错误,但这将使您在Audacity中可以打开一个不错的1 KHz正弦波16位PCM:
#include <stdio.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358
#endif
int main(void)
{
FILE* f = fopen("sinewave.pcm", "wb");
double t;
for (t = 0; t < 1; t += 1./8000) // 8000 is the sample rate in Hz
{
double sample = 15000 * sin(2 * M_PI * 1000 * t); // 1000 Hz sine wave
short s16 = (short)sample;
unsigned char c;
c = (unsigned)s16 % 256;
fwrite(&c, 1, 1, f);
c = (unsigned)s16 / 256 % 256;
fwrite(&c, 1, 1, f);
}
fclose(f);
return 0;
}
在Audacity中,通过File-> Import-> Raw Data导航:
编码:带符号的16位PCM
字节顺序:小端
声道数:1声道(单声道)
采样率:8000
进口。
关于c - 写入16位原始PCM文件时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3325403/