通过简单地缩放数据来增加幅度(并且可能是 FFT 质量)是否有效?

信息处理 fft
2021-12-20 12:46:46

我正在使用 Mark Borgerding 的“KISS FFT”版本。它接受一个 16 位定点输入值数组并生成一个 32 位浮点结果数组。

我发现如果输入幅度很低,许多浮点结果值都为零,但如果我只是缩放输入(例如,因子 16),那么更少的输出值为零,因此输出似乎包含更多详情。(并不是说这对我的目的很重要,但为了保持一致性,我将得到的浮点值除以相同的比例因子。)

无论如何,这似乎可行,就在以前我刚刚得到一个几乎全为零的缓冲区时产生结果而言,但我想知道是否有某种原因它可能不是一种有效的方法。

(请注意,这种方法意味着数据有更多的“粗糙度”/粒度,特别是通常不会出现的低级噪声。我几乎想知道注入是否明智一些低电平噪声来替换输入中的零值。)

2个回答

这可能是一种有效的方法。您正在观察一个非常实际的问题,该问题在使用定点(即整数)算术时经常出现(尽管它也可能发生在浮点数中)。当您用于执行计算的数字格式没有足够的精度来表示您的计算可能产生的所有值范围时,需要某种形式的舍入(例如截断、舍入到最近等)在)。这通常被建模为信号的附加量化误差

但是,对于算法和舍入方案的某些组合,当输入信号的幅度非常低时,可能会得到您观察到的结果:大量的零输出。基本上,在操作序列的某处,中间结果变得足够小,不会打破量化到非零水平所需的阈值。然后将该值四舍五入为零,这通常可以向前传播到输出。正如您所指出的,结果是一种生成大量输出零的算法。

那么你能通过扩大数据规模来解决这个问题吗?有时(很少有技术一直有效!)。如果您的输入信号的幅度限制在数值格式的满量程以下(16 位有符号整数从 -32768 到 +32767),那么您可以将输入信号向上缩放以更充分地使用可用于它。这有助于减轻舍入误差的影响,因为与感兴趣的信号相比,任何舍入误差的幅度都变得更小。因此,如果您的所有输出都在算法内部四舍五入为零,这可能会有所帮助。

这种技术什么时候能伤害到你?根据算法计算的结构,放大输入信号可能会使您面临数值溢出。此外,如果信号包含的背景噪声或干扰的幅度大于算法的舍入误差,那么您在输出中获得的质量通常会受到环境的限制,而不是计算中引入的错误。

处理这个问题的最简单和最简单的方法是在 FFT 之前将数据转换为浮点并使用浮点 FFT。这种方法的唯一缺点是您可能会消耗更多的处理器和内存。由于您的输出无论如何都是浮点数,因此可能几乎没有实际差异。