时间:2010-07-24 14:07:06

标签: c wav pcm 16-bit

6 个答案:

答案 0 :(得分:4)

我不知道你的代码究竟出现了什么问题而没有看到它,但这会让你在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-&gt; Import-&gt;原始数据:

编码:签名的16位PCM
字节顺序:Little-endian
频道:1频道(单声道)
采样率:8000

导入。

答案 1 :(得分:3)

答案 2 :(得分:0)

答案 3 :(得分:0)

答案 4 :(得分:0)

僵尸这个帖子:

来自WAV Wiki:

WAV格式存在一些不一致之处:例如,8位数据是无符号的,而16位数据是有符号的

答案 5 :(得分:0)

您必须将代码从浮点数重新采样为整数,这意味着您需要在某个点舍入,以免给信号增加噪声和直流偏移

float sample = out * 256.f;   // amplify to new range.
int pcm32 = (int)floorf(sample + .5f); // round and convert to 32 bit pcm.

// saturate just before conversion if possible, that's always safer.
if (pcm32 > SHRT_MAX) pcm32 = SHRT_MAX;
if (pcm32 < SHRT_MIN) pcm32 = SHRT_MIN;

short int pcm16 = (short int)pcm32;  // keep the lowest 16 bits

您是否考虑过对振幅使用-1.0到+1.0的标准归一化范围?