为什么在合成(IDFT)而不是分析(DFT)时将幅度标准化?


17

在我看到的大多数示例和FFT代码中,前向DFT操作的输出(频率幅度)按N进行缩放-即,不是给您每个频率仓的幅度,而是给您N倍的幅度。

在操作上,这仅仅是因为DFT是通过将信号的内积与每个基本正弦值(即未归一化的相关性)相乘来计算的。但是,这不能回答这样一个哲学问题,即为什么我们不返回输出之前就只除以N?

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

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

在每种情况下,我都可以做梦,实际的幅度(不是幅度* N)是我从DFT操作中需要的值,而归一化的幅度是我想输入到IDFT操作中的值。

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


2
老实说,我认为这是这里有史以来最酷的问题之一。
声子

Answers:


9

无论您缩放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的DC分量必须为1。并且很明显,无论DFT的大小如何,情况都是如此。 DFT,因为DC分量只是输入值的总和(即FIR系数的总和)。

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

这两个示例之间的根本区别是什么?

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

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

一定不能缩放逆变换。

现在让我们考虑逆DFT。与前向DFT一样,我们必须考虑向其提供能量的样本数量。当然,我们在这里必须更加小心,因为我们必须适当地填充正向和负向频率段。但是,如果我们将脉冲(即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

时域

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

非窗口频率域

这三个组件都提供相同量的能量这一事实是显而易见的,这可以解释DFT的结果,但是这里需要指出一个重要的观点。

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

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

使事情复杂化的是,我们几乎可以肯定地在此信号上加一个窗口,以提高DFT的光谱分辨率。由于第一和第三频率分量位于信号的开始和结尾,因此它们被衰减27 dB,而中心分量仅被衰减4 dB(汉宁窗)。

窗口光谱

显然,DFT的输出可能是输入的相当差的表示,无论缩放与否。

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

使用频谱分析仪,模拟或FFT分析信号时,问题相似。您不知道所显示信号的功率,除非您也知道其占空比。但是即使那样,开窗,跨度,扫描速率,滤波,检测器类型和其他因素也都可以使结果变得令人满意。

最终,在时域和频域之间移动时必须非常小心。您提出的有关缩放的问题很重要,因此希望我已经明确表示您必须了解DFT的输入才能知道如何缩放输出。如果未明确定义输入,则无论是否扩展DFT的输出,都必须对其表示怀疑。


我选择此答案是为了全面和详细的信息,但也请参阅Phonon的出色答案以获取直观的概述。
bryhoyt

9

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

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

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

好的,现在让我们分析相同的数字数组,即我们的16个字符串,但是在这种情况下是系统。我们从概念上希望系统的频率响应是什么意思?大多数人会说,这是输出与输入的振幅之比,即传递函数。在这种情况下,假设我们将单位幅度的DC信号馈入系统,并查看稳态响应的幅度。好吧,将两个恒定的16抽头信号卷积在一起,您会得到一个瞬态斜坡,其后是一个稳态输出,该输出是一个振幅为DC的DC信号(check-this-out!)16!在这种情况下,我们对非标度分析变换的定义比其他方式更有意义。

归根结底,这就是您要代表的一切。考虑DFT的这种以系统为中心的定义有很多原因。

但是,如果我们仅从数学角度看变换,则这两个都不是最有意义的,因为我们可以通过分析和合成变换都缩放来使该变换正交normal正1(N)


好答案,谢谢!我选择user5108_Dan的答案是为了全面,但是您的答案肯定有助于提供最佳的直觉。
bryhoyt

7

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

这3个缩放比例变化都允许使用Itw(FFT(x))往返行程,将通用的未缩放sin()和cos()三角函数用于旋转因子,以进行身份​​转换。

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

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.