2015-11-21 16 views
5

Tôi hiện đang cố gắng hiểu chức năng fft từ bị sần. Tôi đã thử nghiệm giả định sau:
Tôi có hai hàm, f(x) = x^2g(x) = f'(x) = 2*x. Theo luật chuyển đổi fourier và alpharam alpha, nó phải là G(w) = 2pi*i*F(w) (các bộ tiền tố có thể khác nhau, nhưng chỉ nên có một yếu tố không đổi). Khi thực hiện điều đó trong python, tôi viếtNumpy.fft.fft hoạt động như thế nào?

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 

Bây giờ tôi đang mong đợi một giá trị gần như không đổi cho c, nhưng tôi nhận

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 ]) 

đâu là sai lầm của tôi, và những gì tôi có thể làm gì để sử dụng FFT như dự định?

+2

Phần không chính xác ở đây là 'G (w) = 2 pi i F (w) '. Nên là 'G (w) = 2 pi i w F (w)'. –

+0

@DietrichEpp: w là gì trong các mảng đó, và nó cũng là tưởng tượng? –

+0

@arc_lupus 'w' là tần số không gian tương đương với' x'. Trong trường hợp này, bạn có 'x^2' trong không gian ban đầu, không có tần số, mỗi lần (ít nhất là không dễ hiểu), vì vậy bạn sẽ nhận được vô số các đỉnh khác nhau đại diện cho' x^2'. Ví dụ, nếu 'f (x) = sin (x)', thì bạn sẽ có một func delta đơn giản, đẹp tại 1 để nắm bắt tần số đơn giản trong 'sin (x)'. –

Trả lời

5

Các thuộc tính bạn cung cấp áp dụng cho Continuous Fourier transform (CFT). Những gì được tính toán bởi FFT là Discrete Fourier transform (DFT), có liên quan đến CFT nhưng không chính xác tương đương.

Đúng là DFT tỷ lệ thuận với CFT trong các điều kiện nhất định: cụ thể là lấy mẫu đầy đủ của hàm không nằm ngoài giới hạn mẫu (xem ví dụ: Phụ lục E của this book).

Không có điều kiện nào cho các chức năng bạn đề xuất ở trên, vì vậy DFT không tỷ lệ thuận với CFT và kết quả số của bạn phản ánh điều đó.


Dưới đây là một số mã xác nhận qua FFT mối quan hệ bạn quan tâm, sử dụng một chức năng ban nhạc hạn chế lấy mẫu một cách thích hợp:

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 
Các vấn đề liên quan