作为一个小型实验音乐作品,我试图用标准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/

10-11 19:03