使用24位音频样本工作

3
什么是处理24位音频的“标准方法”?实际上,没有可用的24位数据类型。以下是我想到的方法:
  1. 将24位音频样本表示为32位整数,并忽略高8位。
  2. 与(1)类似,但忽略低8位。
  3. 将24位音频样本表示为32位浮点数。
  4. 将样本表示为3个字节的结构体(适用于C/C++,但不适用于Java)。
你如何解决这个问题?
1个回答

4

将它们存储为32位或64位的signed intfloatdouble,除非您对占用最小空间并且关心这个问题。

音频样本通常显示为24位,因为这通常是DAC和ADC的分辨率 - 虽然在大多数计算机硬件上,不要惊讶地发现底部的3或4位以噪声形式随机震荡。

数字信号处理操作 - 这通常是从采样后面发生的 - 都涉及加权样本之和。 存储在整数类型中的样本可以被认为是带有某个任意二进制点的定点二进制数 - 您可以选择策略性地选择其位置以保持尽可能多的精度位。

例如,两个24位整数的总和等于25位的结果。 8次这样的加法后,32位类型会溢出,您需要通过四舍五入和向右移位来重新规范化。

因此,如果您使用整数类型存储样本,请尽可能使用最大的类型,并从最不重要的24位样本开始。

当然,浮点类型会自动处理这个细节,尽管您在何时进行重新规范化方面的选择较少。 如果有硬件支持,它们是音频处理的常用选择。单精度float具有24位尾数,因此可以保留24位样本而不会丢失精度。

通常,浮点样本存储在范围内-1.0f < x < 1.0f


谢谢你对我的问题给予了非常周到的回答!如果你是我,你会选择哪种音频样本表示方式来进行Java中的音频处理,包括FFT和均衡?32位有符号整数还是32位浮点数? - ezpresso
在这种情况下,我认为你别无选择,只能使用float。在整数算术中进行FFT非常困难。 - marko
太感谢了!得去写码啦! - ezpresso
建议修改:使用“重新归一化”而不是“去归一化”。去归一化是完全不同的东西。 - Bjorn Roche
因此,如果您使用整数类型来存储样本,请使用最大的类型,并从最不重要的24位开始。但这并不一定适用于所有情况。取决于您的操作,您可能需要保留精度而不是空余余量。 - Bjorn Roche
@BjornRoche 我的意思是从以最高有效位对齐的样本开始 - OP 正确地询问了在 32 位字中放置 24 位样本的具体位置。显然,对于产生更宽结果的操作,如果字宽允许,移动二进制点可能是合适的。 - marko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接