一个复数如何在FFT结果中捕获相位、幅度和频率?

4
我理解fft的结果中实部和虚部捕捉了幅度和相位,但是每个采样点如何捕捉相位呢?
相位是否与时域中提供的N个离散采样有关?
也就是说,如果输入包括44100个采样点一秒钟,则FFT的每个结果值代表1/44100的相位吗?
例如,第一个FFT值在频率1/44100处,第二个值在2/44100处,以此类推?

你需要更具体地说明你想要哪个阶段。例如,是哪个阶段? - hotpaw2
4个回答

5

FFT的输出简单地表达了如何从谐波关系的正弦波组成中重构原始波形。

每个输出值表达了相应分量的振幅和相位(即偏移角度)。需要注意的是,每个分量都是一个复杂正弦波(形式为A * exp(j * 2pi * f * n + phi),而不是A * cos(2pi * f * n + phi))。

频率隐含在输出样本的索引中;如果采样率为fs(以Hz为单位),并且您有一个长度为N的FFT,则对应于输出样本i的中心频率为i*fs/N(以Hz为单位)。


fs是以什么表示的?比如说我的采样率为每秒44100个样本,那么fs的值是多少?根据您的解释,我理解在我的例子中N = 44100。那么fs是多少呢? - steve landiss
@stevelandiss:名义上是赫兹,但实际上它可以是任何频率单位。 - Oliver Charlesworth

4
我觉得你在问题的某些部分用"相位"时想表达的是"频率"吧?
无论如何,如果你询问的是频率,它的工作方式与“输入”数据中的时间非常相似。您从时间序列数据开始,其中每个数组元素都在不同的时间点上。FFT之后,“输出”类似,但每个元素都是不同的频率。
它们范围从恒定偏移到可能的最高频率,在均匀步骤中,但实际顺序可能取决于您使用的实现。因此,每个复数表示特定频率上的幅度和相位-您可以从输出数组中的位置计算出频率。
如果您有覆盖时间T的N个点,则最高频率为N /(2T),值为1 / T的倍数(包括0Hz-恒定偏移)。例如,60个样本在1分钟内(N = 60 T = 60s)会产生最高频率为0.5Hz。没有更高的频率,因为数据没有被足够采样以清晰地捕获它们(例如,1 Hz信号可能在每个样本上都处于最大值,因此会显示为恒定信号)。这个限制称为奈奎斯特频率
(假设输出是一个复数数组;通常它是一个浮点/双精度数组,您需要从数组的不同部分拼凑出实数和虚数值的复数 - 这变得有点混乱,但概念相同,就好像您返回了一组复杂数值数组。)
提示:通常当我需要使用某个fft例程时,我会制作一些具有恒定偏移量和两个已知频率正弦波的数据,然后对其进行fft并查看结果。如果使每个分量的幅度不同,则通常很容易看出事物的顺序。您还可以检查比例尺,因为有时会省略2pi的因子...

是的,这就是我所问的,我认为你回答了我的问题。实际上,我有一个复数输出数组,事实上我有N个这样的值,其中N是馈送到FFT的离散时间域样本数。因此,我想知道如何计算每个样本的HZ值。第一个样本在1/4100 HZ处,第二个样本在2/44100 HZ处,以此类推吗? - steve landiss
你需要阅读例程的文档。你已经有了基本的想法(希望现在一切都清楚了:o),但实际顺序可能因实现而异。哦,还有一个0Hz的值(常量偏移量)。 - andrew cooke
@OliCharlesworth,谢谢。所以如果我弄反了,那么第一个元素就在1HZ处,第N个元素(在我的情况下N=每秒44100个样本)就在1/44100 HZ处?如果是这样,那么如何表示大于1HZ的频率? - steve landiss
抱歉,我原来想说的是60个样本。谢谢!它以1Hz的采样率进行采样,这就是为什么1Hz信号看起来像一个常量。这就像电影胶片冻结运动一样... - andrew cooke
第一个复杂结果通常是0赫兹(直流),而不是1赫兹。 - hotpaw2
显示剩余3条评论

4
该阶段与输入样本中周期信号分量的时间偏移相关。
以下是如何看待这个问题...
首先,回想一下,快速傅里叶变换(FFT)与离散傅里叶变换(DFT)完全相同,只是计算效率更高。 因此,回到基础知识,我们将变换定义为:
Xk (0 <= k <= N-1) = sum for 0 <= n <= N-1 (xn * e ^ (-j * 2 * π * n * k / N))
其中: xn 是输入样本 Xk 是输出/变换样本 N 是样本数
现在,这个复指数 e ^ (-j * 2 * π * n * k / N) 在 Re / Im 平面上表示圆上的点(半径为1,位于(0,0)处)。 如果您忘记了,请参见Euler's formula
对于固定值的k(代表输出/变换中感兴趣的特定频率),对于所有n,在这个圆上不超过N/k个不同的点。
再次查看公式中的总和:
sumfor 0<=n<=N-1(xn * e-j * 2*π * n * k/N)
在这个总和中,您通过输入信号xn来缩放从点(0,0)到上述圆上的点的向量。您正在使这些向量变长或变短。然后将它们加起来。
如果恰好xn包含具有周期为N/k的周期性信号,则该信号的所有最大值都会在圆上的一个点上对齐并相互放大。最小值和信号的所有其他值也有贡献。
简单来说,您在这里做的是将输入 xn 缠绕在圆上。如果信号中有一个周期性分量,其周期与“周长”(=圆上的点数)相匹配,则由于最大值和最小值的对齐,您会得到该周期/频率的峰值。如果周期不匹配“周长”,则最大值会到处乱跑并互相抵消。这就是傅里叶变换的本质,这也是它如何以及为什么起作用的原因,没有魔法,没有真正复杂的数学,只是将绳子简单地缠绕在卷轴上。
而您在 Xk 中获得的相位仅指示所有最大值对齐的圆上的点。如果将周期性信号在 xn 中向右或向左移动一个或多个样本,则对齐点也会相应移动,并且相位会相应更改。
这就是几何解释。
现在,您可以将这个相同的东西视为傅里叶变换的数学属性。
如果你有 xn 和它的变换 Xk=F{xn},那么 xn-m 的变换将会是 F{xn-m} = F{xn} * e-j * 2*π * k * m/N = Xk * e-j * 2*π * k * m/N。这被称为移位定理/性质。你应该能够轻松地推导出来。e-j * 2*π * k * m/N 这个因子的幅度为1,只有在乘以 Xk 时才会改变相位。

而相位与频率无关。

此外,您采样信号xn的最大频率是采样率的一半(实际上,略低于一半,请参见Nyquist采样定理)。这意味着在您的情况下,傅里叶变换将永远不会给出高于或等于22050 Hz的任何信息,因为所有更高频率的信息都已经丢失到采样中。
k > N/2时,Xk值的一半将给出具有负频率的分量。这是因为在圆上移动点之间的方向反转。因此,尽管输出/变换中有许多样本,但最大频率仍然小于采样率的一半。

1

在FFT结果向量中,复数并不能捕获频率。每个包含复数的数组元素的索引捕获了频率倍增器。然后,您需要将索引乘以频率比例因子,该因子与时域样本的采样率以及FFT长度的倒数有关,以获取每个FFT bin的中心频率。

每个FFT结果向量元素所代表的频率正弦波都具有自己独立的相位,不与任何其他bin或数组元素共享。

如果您不知道FFT的长度,则无法确定频率。因此,对于您问题的最后一部分,答案可能是未知或否。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接