np.fft.fft()返回一个复数数组....复数的含义是什么?我想真正的部分是振幅!虚部是相移?相位角 ?或者是其他东西 !
我想出数组中的位置代表频率.
fja*_*rri 13
这不是一个真正的编程问题,并不是特定的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) + ...
Run Code Online (Sandbox Code Playgroud)
一个FFT将返回这些系数A,B对应于一些固定的频率等等w1,w2等等(在numpy,你可以从他们的价值观fftfreq() ).
现在,这些系数通常很复杂.复数A可以表示为"幅度"和"相位"的组合,如下所示:
A = r exp(i p)
Run Code Online (Sandbox Code Playgroud)
其中r(== numpy.abs(A))是幅度,p(== numpy.angle(A))是相位,都是实数值.如果你将它替换为FFT扩展中的术语,你就得到了
r exp(i p) exp(i w t) == r exp(i (w t + p))
Run Code Online (Sandbox Code Playgroud)
因此,幅度r改变了该项的绝对值,并且相位p也改变了相位.因此,为了从FFT结果中获得幅度数组,您需要应用numpy.abs它.
但我真的建议你阅读有关FFT理论的内容,周围有很多信息,比如维基.
对于我所知道的任何DFT实现,您获得的值数组是一个复数数组.复数具有一个范数,它对应于幅度.根据实部和虚部,它在复平面上有一个角度(有时称为参数).该角度对应于相位.复杂的飞机(来自Wolfram docs):

因此,您的数组包含x和y,实部和虚部.你对这个角度很感兴趣theta.可以这样计算:
tan(theta) = y/x
theta = arctan(y/x)
这产生以弧度表示的角度.您可能还想看看numpy.angle().