为什么对 fft 使用整数算法
why use an integer algorithm for fft
我正在做一个简单的信号处理项目,我在输入信号上应用 fft,找到频率范围内的峰值,围绕该峰值频率进行滤波,并在生成的通带中绘制信号。我在 python 中完成了此操作,现在我被要求在 C 中使用整数算法。
我正在寻找关于为什么通常需要或需要整数算法的一些说明。我可以假设性能和内存开销会大大改善,但任何关于原因细节的指导都会很棒。另外,这实际上很重要的一些硬件应用程序是什么? Arduino,手机?
如有任何提示或信息指针,我们将不胜感激。
设计一个 Integer-only 算法是可取的,主要是为了性能,在当今几乎任何硬件应用程序中。
传统上,任何通用数字处理器都包含专用电路来执行整数运算。现在想象一下,如果您必须在纸上进行任何单个浮点数学运算(假设数字不是整数),您最终会使用某种技术将运算分解为多个整数运算。这是一个简单的例子:
1.1 * 2.0 =
(1 * 2) + (0.1 * 2) =
(1 * 2) + (1 * 2) * 0.1 =
(1 * 2) + (1 * 2) / 10
所以这里一个 floating-point 乘法变成了 2 个整数乘法,一个除法和一个加法。您现在可以想象,任何编译器都会为您进行这种转换,因此整数处理电路可以完成这项工作,并且每次完成后 CPU 指令的总量都会增加很多。
现代处理器将具有专用的浮点电路,但即便如此,与整数处理电路相比,该电路也相当复杂并且需要更多时间来完成指令。
晶体管较少的处理器(例如 Arduinos 中的 AVR 芯片)没有浮点运算硬件,浮点运算的软件仿真速度较慢且能效低得多。几十年前编写许多 DSP 教科书时,此类处理器更为普遍(甚至 cabinet-sized 小型计算机也是如此)。今天,小型 FPGA 和 IoT 处理器旨在通过单个纽扣电池或更小的电池(助听器等)运行,可能仍然存在这样的有源晶体管数量限制。
我正在考虑进行整数 FFT,因为我必须将我的 RTL2832 加密狗的输出从 8 位无符号提升为浮点数,这样我才能进行 FFT。这看起来有点傻,每秒采样 200 万次。
但除此之外,我认为浮点处理器更像是计算器而不是计算机。他们可能在内部使用 BCD 而不是二进制,他们使用以 10 为基数的数字(就像我们所做的那样)而不是以 2 或 16 为基数。
我正在做一个简单的信号处理项目,我在输入信号上应用 fft,找到频率范围内的峰值,围绕该峰值频率进行滤波,并在生成的通带中绘制信号。我在 python 中完成了此操作,现在我被要求在 C 中使用整数算法。
我正在寻找关于为什么通常需要或需要整数算法的一些说明。我可以假设性能和内存开销会大大改善,但任何关于原因细节的指导都会很棒。另外,这实际上很重要的一些硬件应用程序是什么? Arduino,手机?
如有任何提示或信息指针,我们将不胜感激。
设计一个 Integer-only 算法是可取的,主要是为了性能,在当今几乎任何硬件应用程序中。 传统上,任何通用数字处理器都包含专用电路来执行整数运算。现在想象一下,如果您必须在纸上进行任何单个浮点数学运算(假设数字不是整数),您最终会使用某种技术将运算分解为多个整数运算。这是一个简单的例子:
1.1 * 2.0 =
(1 * 2) + (0.1 * 2) =
(1 * 2) + (1 * 2) * 0.1 =
(1 * 2) + (1 * 2) / 10
所以这里一个 floating-point 乘法变成了 2 个整数乘法,一个除法和一个加法。您现在可以想象,任何编译器都会为您进行这种转换,因此整数处理电路可以完成这项工作,并且每次完成后 CPU 指令的总量都会增加很多。
现代处理器将具有专用的浮点电路,但即便如此,与整数处理电路相比,该电路也相当复杂并且需要更多时间来完成指令。
晶体管较少的处理器(例如 Arduinos 中的 AVR 芯片)没有浮点运算硬件,浮点运算的软件仿真速度较慢且能效低得多。几十年前编写许多 DSP 教科书时,此类处理器更为普遍(甚至 cabinet-sized 小型计算机也是如此)。今天,小型 FPGA 和 IoT 处理器旨在通过单个纽扣电池或更小的电池(助听器等)运行,可能仍然存在这样的有源晶体管数量限制。
我正在考虑进行整数 FFT,因为我必须将我的 RTL2832 加密狗的输出从 8 位无符号提升为浮点数,这样我才能进行 FFT。这看起来有点傻,每秒采样 200 万次。
但除此之外,我认为浮点处理器更像是计算器而不是计算机。他们可能在内部使用 BCD 而不是二进制,他们使用以 10 为基数的数字(就像我们所做的那样)而不是以 2 或 16 为基数。