从 DAW 到声卡的音频位深度“映射”:这是正确的吗?

信息处理 固定点 位深度 浮点
2022-02-02 19:34:24

假设我使用一些合成器(在我的例子中是 Sytrus)在我的DAW中生成一个 1 kHz 的正弦波。我对其进行了标准化,因此它以最大“数字”幅度 0db 播放。

因此,信号的任何样本都将获得浮点值(使用 FL Studio 32 位精度3280位精度;但现在这无关紧要)。

这意味着所有值(因为信号被归一化)从 -1.0 变为最大值 1.0。

现在,信号通过ASIO Drive并到达我的声卡(一个 M-Audio FireWire Solo),24 位(定点表示)。由于 ENOB,它将使用 21 位,因此最大值将为1048576100000000000000000000二进制)。

1.0声明该值映射到是否正确100000000000000000000-1.0_000000000000000000000

我真的不确定。这种映射会发生吗?我使用的范围是否正确(-1.0/1.0=> 000000000000000000000/100000000000000000000)?

如果有的话,你能帮我理解这个“映射”吗?

2个回答

你做出错误的假设:

  • 您的音频软件可能适用于浮点数。在大多数情况下,它会在将它们移交给操作系统的健全架构之前对其进行转换,但这些架构通常为用户级应用程序提供广泛的样本格式——无论是浮点数、有符号整数还是无符号整数。
  • 声音系统在内部转换为声卡驱动程序的格式——同样,驱动程序通常为操作系统提供多种样本格式
  • 然后,驱动程序将其获得的内容转换为适当的在线格式。这通常绝对特定于您的硬件。它通常不是浮点数。它可能是位深度非常不同的有符号或无符号 2 补码整数,或其他。无极限:有人将驱动和硬件一起设计,有很多与“它是一种易于理解的标准数字格式”无关的要求。
  • 声卡硬件采用在线格式并将其转换为适合内部 DSP 的内部采样格式。通常,您不知道那是什么。
  • DSP 链最终将与 DAC 通信——DAC 可以采用 1 到 32 位之间位深的有符号或无符号整数。

哦,在你考虑这一切的时候,会造成一些字节顺序混乱。

如果您的声卡的输入范围为 2Vp-p(2 伏峰峰值 = -1V 至 +1v)并且具有 24 位分辨率(ENOB 在这方面没有任何作用,那么对于每个样本,您仍然可以获得 24 位通道,但ENOB 越高,得到的噪声越小),这里是电压代表 ADC 的输出代码:

00000000 00000000 00000000 (lowest possible result from ADC) => -1V
10000000 00000000 00000000 (midpoint) => 0V
11111111 11111111 11111111 (highest possible value) => +1V

或使用 3 位 ADC:

000 (0 dec) => -1V
001 (1 dec)
010 (2 dec)
011 (3 dec)
100 (4 dec) => (midpoint approximately) 0V
101 (5 dec)
110 (6 dec)
111 (7 dec) => +1V

因此电压在整个 ADC 范围内按比例分布,要计算特定代码对应的电压,可以使用以下公式:

U = (code/(2^bits-1)) * (Umax - Umin) + Umin

其中 Umin = -1V, Umax = 1V, bits = 24 有关二进制数和十进制数之间的转换,请参阅本文档