web-dev-qa-db-ja.com

numpy.fft()戻り値の振幅+位相シフトOR角度?

Np.fft.fft()は複素数配列を返します....複素数の意味は何ですか?実数部は振幅だと思います!虚数部は位相シフトですか?位相角?または、他の何か !

配列内の位置が周波数を表していることがわかりました。

7
sten

これは実際にはプログラミングの質問ではなく、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_などに対応するこれらの係数ABなどを返します(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 などの情報がたくさんあります。

15
fjarri

取得する値の配列は、私が知っているDFT実装と同様に、複素数の配列です。複素数には、振幅に対応するノルムがあります。そして、実数部と虚数部によると、複素平面(引数と呼ばれることもあります)に角度があります。この角度は位相に対応します。複素平面( Wolfram docs から):

enter image description here

したがって、配列には実数部と虚数部であるxyが含まれます。角度thetaに興味があります。次のように計算できます。

tan(theta) = y/x

theta = arctan(y/x)

これにより、角度がラジアンになります。 numpy.angle() もご覧ください。

特定の周波数での大きさrは、元の信号のその周波数の量を表します。複素数の偏角は、位相角シータを表します。

x + i * y = r * exp(i * theta)

ここで、xとyは、numpyFFTが返す数値です。

2
wrdeman