2015-11-21 12 views
5

現在、numpyからfft関数を理解しようとしています。そのために私は次の前提をテストしました:
私はf(x) = x^2g(x) = f'(x) = 2*xという2つの関数を持っています。フーリエ変換の法則とwolfram alphaによれば、それはG(w) = 2pi*i*F(w)であるべきです(prefactorsは変わることができますが、一定の因子だけがあるべきです)。 Pythonで、私はnumpy.fft.fftはどのように機能しますか?

import numpy as np 
def x2(x): 
    return x*x 
def nx(x): 
    return 2*x 

a = np.linspace(-3, 3, 16) 
a1 = x2(a) 
a2 = nx(a) 

b1 = np.fft.fft(a1) 
b2 = np.fft.fft(a2) 

c = b1/b2 

を書くことを実装する際に今私はcのためのほぼ一定の値を期待していますが、私のミスで、私はFFTを使用するために何ができるのはどこ

array([ 1.02081592e+16+0.j  , 1.32769987e-16-1.0054679j , 
     4.90653893e-17-0.48284271j, -1.28214041e-16-0.29932115j, 
     -1.21430643e-16-0.2j  , 5.63664751e-16-0.13363573j, 
     -5.92271642e-17-0.08284271j, -4.21346622e-16-0.03978247j, 
     -5.55111512e-16-0.j  , -5.04781597e-16+0.03978247j, 
     -6.29288619e-17+0.08284271j, 8.39500693e-16+0.13363573j, 
     -1.21430643e-16+0.2j  , -0.00000000e+00+0.29932115j, 
     -0.00000000e+00+0.48284271j, 1.32769987e-16+1.0054679j ]) 

を取得します思惑通り?

+2

:ここ


は適切にサンプリングされた帯域制限機能を使用して、FFTを経由してあなたが興味を持っている関係を確認し、いくつかのコードですπi F(w) 'である。 'G(w)= 2 pi i w F(w)'でなければなりません。 –

+0

@DietrichEpp:これらの配列には何がありますか?それは想像上ですか? –

+0

@arc_lupus 'w'は' x'に相当する周波数空間です。この場合、元の空間に 'x^2'があります。この空間には周波数はありません(少なくとも分かりやすい意味ではありません)ので、xを表すためにさまざまなピークが得られます^ 2'。たとえば、 'f(x)= sin(x)'ならば、単純な周波数を 'sin(x)'で捕捉するために、1で素敵な単純なデルタ関数を使うでしょう。 –

答えて

5

あなたが与えるプロパティはContinuous Fourier transform(CFT)に適用されます。 FFTによって計算されるのは、Discrete Fourier transform(DFT)です。これはCFTに関連していますが、正確には同等ではありません。

DFTは特定の条件、すなわちサンプル限界外でゼロの関数を十分にサンプリングすることでCFTに比例することは事実です(例:this bookを参照)。

DFTはCFTに比例せず、数値結果にも反映されます。ここで間違った部分がG(W)= 2 'である

import numpy as np 

def f(x): 
    return np.exp(-x ** 2) 
def fprime(x): 
    return -2 * x * f(x) 

a = np.linspace(-10, 10, 100) 
a1 = f(a) 
a2 = fprime(a) 

b1 = np.fft.fft(a1) 
b2 = np.fft.fft(a2) 
omega = 2 * np.pi * np.fft.fftfreq(len(a), a[1] - a[0]) 

np.allclose(b1 * 1j * omega, b2) 
# True 
関連する問題