np.fft.fft()返回一个复数数组....复数的含义是什么? 我想真正的部分是振幅! 虚部是相移?相位角 ?或者别的什么!
我发现数组中的位置代表了频率。
答案 0 :(得分:11)
这不是一个编程问题,并不是numpy
特有的。简而言之,复数(sqrt(x.real**2 + x.imag**2)
或numpy.abs()
)的绝对值是幅度。
更详细的说,当您将FFT应用于数组X
(例如,包含不同X(t)
值的函数t
的多个样本时)时,您尝试将它表示为平面波的总和" exp(i w t)
(其中i
是一个虚数单位,w
是一个实值频率),其值w
不同。也就是说,你想要像
X = A exp(i w1 t) + B exp(i w2 t) + ...
FFT会返回与某些固定频率A
,B
等对应的系数w1
,w2
等(在numpy
中,您可以得到它们来自fftfreq())的值。
现在,这些系数通常很复杂。复数A
可以表示为"幅度"的组合。和"阶段"为:
A = r exp(i p)
其中r
(== numpy.abs(A)
)是幅度,p
(== numpy.angle(A)
)是相位,都是实数值。如果将其替换为FFT扩展中的术语,则得到
r exp(i p) exp(i w t) == r exp(i (w t + p))
因此,幅度r
改变了术语的绝对值,而阶段p
也改变了阶段。因此,为了从FFT结果中获得幅度数组,您需要将numpy.abs
应用于它。
但我真的建议你阅读有关FFT理论的内容,其中包含大量信息,例如wiki。
答案 1 :(得分:5)
对于我所知道的任何DFT实现,您获得的值数组是一个复数数组。复数具有一个范数,它对应于幅度。根据实部和虚部,它在复平面上有一个角度(有时称为参数)。该角度对应于相位。复杂的平面(来自Wolfram docs):
因此,您的数组包含x
和y
,实部和虚部。您对角度theta
感兴趣。可以这样计算:
tan(theta) = y/x
theta = arctan(y/x)
这产生以弧度表示的角度。您可能还想查看numpy.angle()。
答案 2 :(得分:2)
给定频率下的幅度r表示原始信号中该频率的量。复数参数表示相角θ,
x + i * y = r * exp(i * theta)
其中x和y是numpy FFT返回的数字。