C++读取16位Wav文件

Pho*_*rce 2 c++ audio wav

我在阅读16位.wav文件时遇到了麻烦.我已阅读标题信息,但转换似乎不起作用.

例如,在Matlab中,如果我在wave文件中读取,我会得到以下类型的数据:

 -0.0064, -0.0047,  -0.0051, -0.0036, -0.0046, -0.0059,  -0.0051
Run Code Online (Sandbox Code Playgroud)

但是,在我的C++程序中,返回以下内容:

0.960938, -0.00390625, -0.949219, -0.00390625, -0.996094, -0.00390625
Run Code Online (Sandbox Code Playgroud)

我需要以相同的方式表示数据.现在,对于8 bit.wav文件,我做了以下内容:

uint8_t c;

for(unsigned i=0; (i < size); i++)
{
    c = (unsigned)(unsigned char)(data[i]);
    double t = (c-128)/128.0;
    rawSignal.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我为16bit执行此操作时,这很有用:

uint16_t c;

for(unsigned i=0; (i < size); i++)
{
   c = (signed)(signed char)(data[i]);
   double t = (c-256)/256.0;
   rawSignal.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)

不起作用并显示输出(上图).

我遵循这里发现的标准

哪里data是一个char数组,rawSignalstd::vector<double>我可能只是递过转换错了,但似乎无法找出.有人有什么建议吗?

谢谢

编辑:

这是现在显示的内容(在图中):

在此输入图像描述

这是它应该显示的内容:

在此输入图像描述

Bjo*_*che 6

这里有一些问题:

  • 8位wavs是无符号的,但是16位wavs是有符号的.因此,Carl和Jay的答案中给出的减法步骤是不必要的.我认为他们只是从你的代码中复制,但他们错了.
  • 16位波的范围从-32,768到32,767,而不是-256到255,这使得你使用的乘法无论如何都是错误的.
  • 16位wavs是2个字节,因此你必须读取两个字节来制作一个样本,而不是一个.您似乎一次只能阅读一个角色.当您读取字节时,如果您的本机字节序不是小端,则可能必须交换它们.

假设有一个小端架构,你的代码看起来会更像这样(非常接近Carl的答案):

for (int i = 0; i < size; i += 2)
{
    int c = (data[i + 1] << 8) | data[i];
    double t = c/32768.0;
    rawSignal.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)

对于大端架构:

for (int i = 0; i < size; i += 2)
{
    int c = (data[i] << 8) | data[i+1];
    double t = c/32768.0;
    rawSignal.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)

该代码未经测试,请LMK如果不起作用.