何时考虑音频的双精度(64位)浮点


12

在现代处理器上合成和处理音频时,何时会考虑使用单精度(32位)浮点以外的其他东西?显然,进出现实世界的音频是16/24位,所以我只是在谈论软件中信号的精度(包括音频本身和诸如滤波器系数之类的东西)。

假使,假设:

  • CPU / DSP具有对单精度和双精度的硬件浮点支持
  • 优先考虑的是高质量音频,而不是高性能。例如,如果双精度可提供更好的(感知)质量,则将考虑采用双精度。

Answers:


9

IEEE浮点单打仅提供约24位尾数。但是许多DSP /滤波算法(单位圆附近具有极点/零点的IIR二阶等)对于中间计算乘积(累加器等)需要的尾数要远远超过24位,只是要使最终结果精确到接近16或24位。对于这些类型的算法,没有FPU的DSP通常使用32位,40位和48位可缩放整数累加器。

但是在许多当前的处理器实现中(用于PC,智能手机等),当算法需要具有超过24位的中间乘积时,双精度FPU的速度要比尝试使用32位或64位的可缩放整数快得多。

为了防止浪费数据缓存,原始数据可以采用短整数或单精度浮点格式,而只有更本地的计算内核才可以使用更高分辨率的格式。但是,如果您要在DSP模块之间共享中间计算结果,则模块之间的互换协议也可能会受益于更高分辨率(超过24位尾数)的总线或数据格式。


这是我所追求的信息。如果您能提供一个需要双重精度才能使过滤器工作的情况的具体示例,即如果听起来像单精度那样听起来不好(或至少相当普通),但像黄油一样光滑,我会接受这个答案。具有双精度。
user1849104 2012年

另外,您破坏高速缓存到底是什么意思?您是说拥有两倍的数据量会使事情变慢吗?
user1849104 2012年

给出了一个示例,IIR在单位圆附近带有极点/零点。如果有缓存,则适合该缓存的算法和工作数据集会比没有缓存的算法和工作数据集快得多。
hotpaw2 2012年

9

CPU / DSP具有对单精度和双精度的硬件浮点支持。

这实际上取决于您在谈论哪种支持。在x86上,使用x87样式浮点指令时,无论是单精度还是双精度,您都可以获得完整的80位内部精度和相同的处理时间。

但是,当使用SIMD指令时,使用32位浮点数所完成的工作要比64位浮点数所完成的工作多两倍。没关系

要考虑的另一件事是内存-使用双精度除以适合高速缓存级别的数据量的两倍。

在现代处理器上合成和处理音频时,

这将取决于您进行哪种合成和处理。如果它涉及IIR滤波器(或更笼统地说,带有状态变量和/或反馈的任何东西),那么如果不使用32位,则可以更轻松地用脚(因系数截断而导致的不稳定性或低截止精度)拍摄想太多你在做什么。一些过滤器拓扑可以完美地与32位一起使用。

无论如何,这都是数值精度问题-就质量而言,不会有任何感知上的差异。请记住,期望硬件音频链具有20位以上的精度是非常荒谬的(假设电路板的布线无可挑剔,并且所有部件都是理想的,我们仍然会遇到Johnson噪声的限制!)-和单精度浮点数在很大程度上覆盖了这种精度。高端混音台上的信号路径具有50多个运算放大器,它们的失真比单精度浮点算术运算的量化噪声分别高几个数量级。


难道是安全地说,使用单精度SIMD指令将永远给你大致两倍以上的双精度性能?
user1849104 2012年

由于我无法再编辑以前的注释:我再也没有机会(直接)使用任何SIMD指令集。是否可以仅使用单精度并获得两倍的性能?还是现实阻碍了?
user1849104 '11

6

您需要知道算法的数值要求,并相应地选择精度。

因此,让我们在这里进行数学计算:一个32位浮点具有24位尾数和8位指数。在约1540 dB的动态范围内,这可提供约150 dB的信噪比。对于大多数音频而言,这已经足够了。双精度为您​​提供大约两倍的精度。

每种算法对数值精度都有一定的要求。如果设计得当,我所知道的所有音频算法都可以很好地处理32位浮点。这里的关键词是“适当设计”。例如,以II4.1R双二阶滤波器的直接实现的,以44.1kHz采样的40-200 Hz的6阶带通确实会在32位存在一些噪声问题。但是,作为转置形式II或直接形式I过滤器,它工作得很好。

如果使用例如Matlab的residencez()函数尝试对同一个带通滤波器进行部分分数扩展,即使精度达到双精度,您也会得到不好的结果。同样,该算法对于特定输入数据的数字要求超过了必须提供的双精度。解决此问题的关键不是盲目提高精度,而是使用更好的算法。

最后,让我们看一下导致浮动(32位或64位)漏洞的原因:您拥有巨大的动态范围,例如,您可以将信号按比例缩小200dB,放大500dB,再次降低300dB,然后最终到达起点几乎没有精度损失。事实并非如此。浮点数很难添加大小相差很大的数字。有一点就是加一个小数字没有什么区别,即得到1 + dx = 1。对于32位浮点,此数字“ dx”约为1.2e-7,对于64位,此数字“ dx”约为2.2e-16。如果算法包括相加或相减数量相差甚远的数字,则可能会遇到问题。

一个很好的例子就是前面提到的Direct Form II过滤器:Direct From II过滤器(请参见例如https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html)基本上是通过过滤输入来计算状态变量的首先使用极点传递函数,然后使用零过滤以创建输出。现在,如果极点靠近单位圆,则仅极点的传递函数会变得非常大。因此,状态变量可能比输入大得多(大80db至100dB),并且将状态变量与输入相加会产生很多噪声。

解决方案是转到转置的Form II或直接Form I过滤器。分析表明,状态变量不能大于输入/输出,而不能大于12dB或大约12dB,因此问题的大小不匹配不会首先发生。


2

相对于单精度,双精度有两个好处:扩大范围和更好的分辨率。如果增加范围对您的应用程序有任何帮助,我将感到非常惊讶。如果是这样,缩放可能存在问题。

如果有改进,它将在分辨率上。更好的分辨率意味着更少的量化噪声。但是,除非量化噪声与所有其他噪声源接近相同水平,否则可能不会有任何区别。您可以对噪声和信号电平进行一些分析,以了解多少噪声是由量化误差引起的,但是直到您同时使用和实现时,您才能真正确定它是否会有所作为。看看是否有所作为。


2

如果您使用的合成音频在生成和渲染之间进行了大量处理(转换为16/24位整数),那么您将受益于以机器具有的最佳数字精度工作。

在整数和浮点数之间进行基本区分也很重要。双精度浮点数(64位)不同于64位整数,甚至可以在软件中使用任意精度整数,具体取决于所使用的软件工具。如果您必须录制声音而不是生成声音,那将很重要(据我所知,AD转换始终将采样的声音保存为整数格式)。

我不能完全确定,但是如果您已经在浮点中生成了声音,那么根据定义,最常见的伪像很可能不会出现,并且您可以以更高的“音频质量”对其进行处理。也许只有在已经对发生器本身应用了某些效果之后,您才能生成声音样本。实际引入任何潜在工件的唯一时间就是将其转换为以某种整数文件格式输出的输出,例如.WAV。

实际上,由于当今大多数机器都具有本机的“双”(64位)精度,所以我不认为再有理由使用32位...

希望有帮助!


3
除非您使用SIMD,否则“我不再看到使用32位的理由了……”!
pichenettes 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.