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



CPU / DSP具有对单精度和双精度的硬件浮点支持。例如,如果它提供更好的(感知)质量,则将考虑使用双精度。


#1 楼

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

但是在许多当前的处理器实现中(用于PC,智能手机等),双精度FPU远远快于当算法需要大于24时尝试使用32或64位可缩放整数

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

评论


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

$ \ begingroup $
另外,您破坏高速缓存到底是什么意思?您是说拥有两倍的数据量会使事情变慢吗?
$ \ endgroup $
–user1849104
2012年11月25日,0:56

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

#2 楼


CPU / DSP具有对单精度和双精度的硬件浮点支持。在x86上,使用x87样式浮点指令时,无论使用单精度还是双精度,您都可以获得完整的80位内部精度和相同的处理时间。

但是使用SIMD时使用说明,使用32位浮点数所完成的工作要比64位浮点数所完成的工作多两倍。这很重要。

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


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


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

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

评论


$ \ begingroup $
可以肯定地说,将单​​精度与SIMD指令一起使用将使您的性能大约是双精度的两倍吗?
$ \ endgroup $
–user1849104
2012年11月25日0:59



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

#3 楼

您需要了解算法的数值要求并相应地选择精度。

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

每种算法对数值精度都有一定的要求。如果设计合理,我所知道的所有音频算法都可以很好地处理32位浮点。这里的关键词是“适当设计”。例如,以II4.1R双二阶滤波器的直接实现的,以44.1kHz采样的40-200 Hz的6阶带通确实会在32位存在一些噪声问题。但是,它可以很好地用作转置形式II或直接形式I滤波器。即使是双精度。同样,该算法对特定输入数据的数字要求超过了必须提供的双精度。解决此问题的关键不是盲目提高精度,而是改用更好的算法。

最后,让我们看一下导致浮动(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或直接表格I过滤器。分析表明,状态变量不能大于输入/输出,而不能大于12dB左右,因此问题的大小不匹配不会首先发生。

#4 楼

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

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

#5 楼

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

对整数和浮点数进行基本区分也很重要。双精度浮点(64位)与64位整数不同,甚至可以在软件中使用任意精度整数,具体取决于所使用的软件工具。如果您必须录制声音而不是生成声音,那将很重要(据我所知,AD转换总是将采样的声音保存为整数格式)。如果您已经在浮点中生成了声音,那么根据定义,很可能不会出现更常见的伪像,并且可以以更高的“音频质量”对其进行处理。也许只有在已经对发生器本身应用了某些效果之后,您才能生成声音样本。实际上,您引入任何潜在工件的唯一时间就是将其转换为某种整数文件格式以供输出,例如.WAV。 “如今(64位)的精度,我认为不再需要使用32位的理由...

希望能有所帮助!

评论


$ \ begingroup $
除非您使用SIMD,否则“我不再看到使用32位的理由了……”!
$ \ endgroup $
–小食
2012年11月24日18:09