为什么在合成(IDFT)而不是分析(DFT)期间对幅度进行归一化?

信息处理 fft 自由度 震级 正常化
2021-12-26 01:04:22

在我见过的大多数示例和 FFT 代码中,前向 DFT 操作的输出(频率幅度)按 N 缩放——即,它不是给你每个频率仓的幅度,而是给你 N 倍的幅度。

从操作上讲,这仅仅是因为 DFT 是通过将信号与每个基正弦(即非归一化相关)的内积来计算的。然而,这并没有回答为什么我们不在返回输出之前除以 N 的哲学问题?

相反,大多数算法在重新合成时除以 N。

这对我来说似乎违反直觉,并且(除非我遗漏了什么)它使 DFT 的所有解释都非常混乱。

在我能想到的每个场景中,实际幅度(不是幅度 * N)是我需要从 DFT 操作中获得的值,而归一化幅度是我想要输入到 IDFT 操作中的值。

为什么不将 DFT 定义为 DFT/N,而将 IDFT 定义为归一化幅度正弦曲线的简单总和?

3个回答

无论您缩放 DFT 的输出是正向还是反向,都与惯例或数学上的方便无关。它与 DFT 的输入有关。请允许我展示一些示例,其中正向和逆变换都需要或不需要缩放。

必须将正向变换按 1/N 缩放。

首先,应该清楚的是,要分析一个简单的正弦波,从数学上讲,变换的长度应该是无关紧要的。假设 N=1024,Freq=100,你的信号是:

f(n) = cos(频率 * 2*Pi * n/N)

如果你取 f(n) 的 1024 点 DFT,你会发现 bin[100] = 512。但这不是一个有意义的值,直到你按 N 缩放它。512/1024 = 1/2 当然,另一个 1/2 在 bin[924] 中的负谱中。

如果将 DFT 的长度加倍,N=2048,则输出值将是 1024 点 DFT 的两倍,这再次使结果毫无意义,除非我们按 1/N 缩放。DFT 的长度不应成为此类分析中的一个因素。因此,在此示例中,您必须将 DFT 缩放 1/N。

不得缩放前向变换。

现在假设您有一个 32 抽头 FIR 滤波器的脉冲响应,并且想知道它的频率响应。为方便起见,我们假设一个增益为 1 的低通滤波器。我们知道,对于这个滤波器,DFT 的直流分量必须为 1。应该清楚的是,无论大小如何,情况都是如此。 DFT 因为直流分量只是输入值的总和(即 FIR 系数的总和)。

因此,对于这个输入,DFT 没有按 1/N 缩放以获得有意义的答案。这就是为什么您可以在不影响变换结果的情况下尽可能多地对脉冲响应进行零填充。

这两个例子的根本区别是什么?

答案很简单。在第一种情况下,我们为每个输入样本提供能量。换句话说,所有 1024 个样本都存在正弦波,因此我们需要将 DFT 的输出缩放 1/1024。

在第二个例子中,根据定义,我们只为 1 个样本提供能量(n=0 时的脉冲)。脉冲通过 32 个抽头滤波器需要 32 个样本,但这种延迟无关紧要。由于我们为 1 个样本提供能量,我们将 DFT 的输出缩放 1。如果用 2 个单位的能量而不是 1 定义脉冲,我们会将输出缩放 1/2。

不得缩放逆变换。

现在让我们考虑一个逆 DFT。与前向 DFT 一样,我们必须考虑我们提供能量的样本数量。当然,在这里我们必须更加小心,因为我们必须适当地填充正频率箱和负频率箱。但是,如果我们在两个适当的 bin 中放置一个脉冲(即 1),那么无论我们在逆 DFT 中使用多少点,逆 DFT 的结果输出都将是幅度为 2 的余弦波。

因此,与正向 DFT 一样,如果输入是脉冲,我们不会缩放逆 DFT 的输出。

必须缩放逆变换。

现在考虑您知道低通滤波器的频率响应并想要进行逆 DFT 以获得其脉冲响应的情况。在这种情况下,由于我们在所有点都提供能量,因此我们必须将 DFT 的输出缩放 1/N 以获得有意义的答案。这不是很明显,因为输入值会很复杂,但是如果您通过一个示例进行操作,您会发现这是正确的。如果您不按 1/N 进行缩放,您将获得 N 量级的峰值脉冲响应值,如果增益为 1,则不会出现这种情况。

我刚刚详述的四种情况是端点示例,很清楚如何缩放 DFT 的输出。但是,端点之间有很多灰色区域。所以让我们考虑另一个简单的例子。

假设我们有以下信号,N=1024,Freq=100:

f(n) = 6 * cos(1*Freq * 2*Pi * n/N)  n = 0 - 127
f(n) = 1 * cos(2*Freq * 2*Pi * n/N)  n = 128 - 895
f(n) = 6 * cos(4*Freq * 2*Pi * n/N)  n = 896 - 1023

时域

注意三个分量的幅度、频率和持续时间差异。不幸的是,该信号的 DFT 将显示所有三个分量的功率电平相同,即使第二个分量的功率电平是其他两个分量的 1/36。

非窗口频域

所有三个组件都提供相同数量的能量这一事实是显而易见的,这解释了 DFT 结果,但这里有一个重要的观点。

如果我们知道各种频率分量的持续时间,那么我们可以相应地缩放各种频率区间。在这种情况下,我们将这样做以准确缩放 DFT 的输出: bin[100] /= 128; 仓[200] /= 768;仓[400] /= 128;

这让我想到了最后一点;一般来说,我们不知道特定频率分量在 DFT 的输入端存在多长时间,因此我们不可能进行这种缩放。然而,一般来说,我们确实为每个采样点提供能量,这就是为什么我们在分析信号时应该将前向 DFT 缩放 1/N。

更复杂的是,我们几乎肯定会对该信号应用一个窗口来提高 DFT 的光谱分辨率。由于第一和第三频率分量位于信号的开头和结尾,它们会衰减 27 dB,而中心分量仅衰减 4 dB(汉宁窗)。

加窗频谱

需要明确的是,DFT 的输出可能是输入的非常差的表示,无论是否缩放。

在逆 DFT(通常是纯数学问题)的情况下,与分析未知信号相反,DFT 的输入是明确定义的,因此您知道如何缩放输出。

使用频谱分析仪、模拟或 FFT 分析信号时,问题类似。除非您也知道其占空比,否则您不知道所显示信号的功率。但即便如此,窗口、跨度、扫描速率、过滤、检测器类型和其他因素都会影响结果。

最后,在时域和频域之间移动时必须非常小心。你问的关于缩放的问题很重要,所以我希望我已经明确表示你必须了解 DFT 的输入才能知道如何缩放输出。如果输入没有明确定义,那么无论您是否对其进行缩放,都必须对 DFT 的输出抱有很大的怀疑。

我可以想到几个涉及计算精度问题的原因,但这可能不公平,因为在数学上我们无论如何都以相同的方式定义它,而数学不知道精度问题。

这是我的看法。让我们从概念上考虑一下 DFT 在信号处理意义上的含义,而不仅仅是纯粹的变换。在这种情况下,在我看来,将 DFT 应用于信号和系统会让我们希望看到不同的结果。

例如,让我们将 DFT 应用于值为 1 的恒定信号。我们还假设这个信号的长度是有限的,并且有 16 个抽头长。在这种情况下,我们想从 DFT 中得到什么?显然,我们希望它告诉我们信号的每个频率分量的幅度。显然,我们的信号具有频率 0 和幅度 1 的单个分量。但是 DFT 在 bin 0 和高度 16 处为我们提供了单个峰值!在这种情况下,您对 DFT 定义的失望是完全有道理的。我们应该缩放分析系数,而不是综合系数。

好的,现在让我们分析相同的数字数组,即我们的 16 个字符串,但在本例中是一个系统。从概念上讲,我们希望系统的频率响应意味着什么?大多数人会说它是输出与输入相比的幅度,即传递函数。在这种情况下,假设我们将一个幅度为单位的直流信号馈入我们的系统并查看稳态响应的幅度。好吧,将两个恒定的 16 抽头信号卷积在一起,你会得到一个瞬态斜坡,然后是一个稳态输出,它是一个幅度为 DC 的信号(检查一下!) 16!在这种情况下,我们对非缩放分析变换的定义比其他情况更有意义。

归根结底,这完全取决于您要代表什么。考虑这种以系统为中心的 DFT 定义有很多原因。

但是,如果我们从纯数学的角度来看变换,那么这些都没有最有意义,因为我们可以通过缩放分析合成变换来使这个变换正交1(N). 这也将保留时间和频率表示的能力,以使Parseval 定理始终成立。

实际上,在各种不同的 FFT/IFFT 实现中,有 3 种不同的方式来放置比例因子:1.0 向前和 1.0/N 向后,1.0/N 向前和 1.0 向后,以及 1.0/sqrt(N) 向前和向后。

这 3 种缩放变化都允许 IFFT(FFT(x)) 往返,对旋转因子使用通用的未缩放 sin() 和 cos() 三角函数,作为恒等变换。

请注意,在前向 FFT 上保留正弦幅度不会保留总能量(如 Parseval 定理)。选择你喜欢的那个。