Np.fft.fft()は複素数配列を返します....複素数の意味は何ですか?実数部は振幅だと思います!虚数部は位相シフトですか?位相角?または、他の何か !
配列内の位置が周波数を表していることがわかりました。
これは実際にはプログラミングの質問ではなく、numpy
に固有のものではありません。簡単に言うと、複素数の絶対値(sqrt(x.real**2 + x.imag**2)
、またはnumpy.abs()
)は振幅です。
より詳細には、FFTを配列X
(たとえば、t
のさまざまな値にある関数X(t)
のサンプルの数を含む)に適用する場合、それを「平面波」の合計として表現しようとします。 "exp(i w t)
(i
は架空の単位、w
は実数値の頻度)で、w
の値が異なります。つまり、あなたは次のようなものが欲しい
_X = A exp(i w1 t) + B exp(i w2 t) + ...
_
FFTは、いくつかの固定周波数_w1
_、_w2
_などに対応するこれらの係数A
、B
などを返します(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 などの情報がたくさんあります。
取得する値の配列は、私が知っているDFT実装と同様に、複素数の配列です。複素数には、振幅に対応するノルムがあります。そして、実数部と虚数部によると、複素平面(引数と呼ばれることもあります)に角度があります。この角度は位相に対応します。複素平面( Wolfram docs から):
したがって、配列には実数部と虚数部であるx
とy
が含まれます。角度theta
に興味があります。次のように計算できます。
tan(theta) = y/x
theta = arctan(y/x)
これにより、角度がラジアンになります。 numpy.angle() もご覧ください。
特定の周波数での大きさrは、元の信号のその周波数の量を表します。複素数の偏角は、位相角シータを表します。
x + i * y = r * exp(i * theta)
ここで、xとyは、numpyFFTが返す数値です。