【问题标题】:How can an audio wave be represented in a long array of floats?如何用一长串浮点数表示音频波?
【发布时间】:2014-09-19 20:33:01
【问题描述】:

在我的应用程序中,我使用的是声音库 Beads(这个问题不是专门针对那个库的)。

在库中有一个类WavePlayer。它接受Buffer,并通过迭代Buffer 来产生声波。

Buffers 只需包装一个 float[]

例如,这里是一个缓冲区的开头:

0.0 0.0015339801 0.0030679568 0.004601926 0.0061358847 0.007669829 0.009203754 0.010737659 0.012271538 0.0138053885 0.015339206 0.016872987 0.01840673 0.019940428 0.02147408  ...

它的大小是 4096 float 值。

使用WavePlayer 对其进行迭代会产生平滑的“正弦波”声音。 (这个缓冲区实际上是Buffer类中的一个现成的“预设”,即Buffer.SINE)。

我的问题是:

这样的缓冲区代表什么类型的数据?它包含什么样的信息,可以让人们对其进行迭代并产生音频波?

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为它属于不同的 SE 站点。当被问到这个问题时,它们并不存在。

标签: audio


【解决方案1】:

阅读这篇文章What's the actual data in a WAV file?

声音只是一条曲线。您可以使用整数或浮点数来表示此曲线。

有两个重要方面:比特深度和采样率。首先让我们讨论位深度。列表中的每个数字 (int/floats) 代表给定时间点声音曲线的高度。为简单起见,当使用浮点数时,值通常在 -1.0 到 +1.0 之间变化,而整数可能在 0 到 2^16 之间变化。重要的是,这些数字中的每一个都必须存储到内存中的声音文件或音频缓冲区中 - 分辨率/保真度您选择表示此曲线的每个点都会影响音频质量和生成的声音文件大小。低保真记录可以使用每个曲线高度测量的 8 位信息。当您攀登保真度频谱时,16 位、24 位……专用于存储每个曲线高度测量值。更多位等同于浮点数的更多有效数字或更广泛的整数(16 位意味着您有 2^16 个整数(0 到 65535)来表示任何给定曲线点的高度)。

现在到第二个方面的采样率。除了测量曲线高度之外,当您捕获/合成声音时,您必须确定测量(采样)曲线高度的频率。典型的 CD 质量记录(采样)曲线高度为每秒 44100 次,因此采样率为 44.1kHz。较低保真度的采样频率较低,超保真度采样频率为 96kHz 或更高。因此,曲线高度测量保真度(位深度)与您执行此测量的频率(采样率)共同决定了声音合成/录音的质量

与许多事情一样,这两个属性应该是平衡的......如果你改变一个,你应该改变另一个......所以如果你降低采样率,你会减少信息负载,因此会降低音频保真度...... . 完成此操作后,您还可以降低位深度,而不会进一步影响保真度

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多