【问题标题】:Obtaining real values from a WAV file c++从 WAV 文件 c++ 中获取实数值
【发布时间】:2013-04-23 15:04:08
【问题描述】:

所以我正在做一个非常重要的学校项目。我现在知道如何从 WAVE 文件中读取所有内容,包括数据。问题是我不仅需要真实的~数据值,还需要符号。该文件为 16 bps,但我不知道如何获得实际值,例如 -365 或 +19934。 这就是我目前所做的

leer = fread(&sbyte, 1, X, audio);

我应该输入什么数字而不是“X”。 4?

我将 sbyte 定义为有符号字符,但有符号字符仅从 -128 变为 127,这意味着它没有给我所需的信息。

我需要这些数字来做一些分析。如果你能在这里帮助我,因为我太迷路了。

谢谢。

【问题讨论】:

  • leer = fread(&sshort, 2, X, audio)
  • 除了char,你还知道哪些类型?另外,查找sizeof。它可能有用。
  • 每个样本 16 位意味着每个样本 2 个字节,显然一个 char 是 1 个字节,所以它不适合。请记住,波形数据以 Little Endian 存储,因此短应是完美的

标签: c++ c audio voice voice-recognition


【解决方案1】:

从此页面:https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

16 位样本存储为 2 的补码有符号整数,范围从 -32768 到 32767。

在这种情况下,您想使用 16 位数据类型,在 C++/C 中是 short

short data;
fread(&data, sizeof(short), 1, audio);

这将为您读取 2 个字节,并将它们存储在 short 中。您将希望循环执行此操作

【讨论】:

  • 这成功了!谢谢!虽然我还有疑问。我正在使用的循环看起来像这样for (i = 0; i < csize; i++),其中 csize 是数据的长度。是正确的还是应该使用 i=i+2 代替,因为我读取的是 16 位而不是像以前那样的 8 位。
  • 嗨,是的,您可以使用i+=2 而不是i++ 并确保fread(&data, sizeof(short), 1, audio+i); 或者,查看fread 的参数,第三个参数是要读取的数据量.本质上,只要您为data 分配了足够的空间,您就可以将csize 放在那里。即类似于 LefterisE 下面所说的。
【解决方案2】:

首先,您需要读取前 44 个字节中的header 信息,如以下链接所示: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

从那里,您可以获取BitsPerSample 并将读取的字节转换为short 整数(如果它是16,char 如果它是8 或int 如果它是32)

【讨论】:

    【解决方案3】:
    short[] data = new short[NumSamples * NumChannels];
    fread(data, sizeof(short), NumSamples * NumChannels, audio);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多