【问题标题】:How to interpret 32 bit float wav data [closed]如何解释 32 位浮点 wav 数据 [关闭]
【发布时间】:2026-01-22 08:55:02
【问题描述】:

如何解释 32 位浮点 wav 数据?我将 wav 数据读取为 I32,然后将其除以 2^31,但没有得到正确的结果。

【问题讨论】:

  • 文件中的数据实际上是 32 位浮点数吗?如果是这样,将其读取为 int32 显然是行不通的。
  • wav 数据可以编码为大端或小端。您可能必须先交换字节。
  • 首先,定义正确的结果。

标签: c++ c floating-point wav


【解决方案1】:

这些值是浮动的。您必须将它们分配给浮点值并按原样使用它们。如果您将浮点值读入 int32 值,则相当于进行了 reinterpret_cast。

float f1 = 1.0e5;
int   i1 = *reinterpret_cast<int*>( &f1 );
// i1 = 1203982336, not 100000

如果你无法避免得到错误的值,那么为了得到“正确”的值,你需要反向重新解释

float f2 = *reinterpret_cast<float*>( &i1 );
// f2 = 1.0e5

数据的字节序可能仍需要调整。

【讨论】:

    【解决方案2】:

    看看你的RIFF header。这将告诉您 Wav 文件的字节顺序。

    使用该字节序正确读取您的 32 位浮点数。例如:如果您的系统是 little endian(例如,基于 x86 处理器)并且您的 wav 文件是 big endian(例如,在旧的 PPC mac 上创建),您需要在阅读完之后执行32-bit endian swap数据,以便您的浮点变量实际上包含有意义的数据(这通常是 -1.0f 和 1.0f 之间的值)

    【讨论】:

    • 谢谢大家!将数据读取为浮点数解决了这个问题。数据存储为 32 位浮点数,因此将其作为 int 读取确实没有意义。