python의 fftconvolve
과 관련하여 질문이 있습니다. 나의 현재 연구에서는 두 함수 사이의 회선을 계산해야했습니다. 이렇게하려면 푸리에 변환을 사용하여 계산합니다 (이는 numpy.fft
을 사용하고 정규화했습니다). 문제는 내가 fftconvolve
패키지를 사용하여 그것을 비교하기를 원한다면 올바른 결과를 얻지 못한다는 것입니다.scipy.signal.fftconvolve가 필요한 결과를 제공하지 않습니다.
#!/usr/bin/python
import numpy as np
from scipy.signal import fftconvolve , convolve
def FFT(array , sign):
if sign==1:
return np.fft.fftshift(np.fft.fft(np.fft.fftshift(array))) * dw/(2.0 * np.pi)
elif sign==-1:
return np.fft.fftshift(np.fft.ifft(np.fft.fftshift(array))) * dt * len(array)
def convolve_arrays(array1,array2,sign):
sign = int(sign)
temp1 = FFT(array1 , sign,)
temp2 = FFT(array2 , sign,)
temp3 = np.multiply(temp1 , temp2)
return FFT(temp3 , -1 * sign)/(2. * np.pi)
""" EXAMPLE """
dt = .1
N = 2**17
t_max = N * dt/2
time = dt * np.arange(-N/2 , N/2 , 1)
dw = 2. * np.pi/(N * dt)
w_max = N * dw/2.
w = dw * np.arange(-N/2 , N/2 , 1)
eta_fourier = 1e-10
Gamma = 1.
epsilon = .5
omega = .5
G = zeros(N , complex)
G[:] = 1./(w[:] - epsilon + 1j * eta_fourier)
D = zeros(N , complex)
D[:] = 1./(w[:] - omega + 1j * eta_fourier) - 1./(w[:] + omega + 1j * eta_fourier)
H = convolve_arrays(D , G , 1)
J = fftconvolve(D , G , mode = 'same') * np.pi/(2. * N)
당신은 또한 w
축에 변화를 볼 수 있습니다 J
H
의 실제/허수 부분을 플롯하면 어떻게 든 얻기 위해 J
의 결과를 곱했다 : 여기 내 코드입니다 정확한 결과를 닫을 수는 있습니다.
제안 사항?
감사합니다.
['scipy.fftconvolve'] (https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L153)를보고 알고리즘이 없음을 관찰하십시오. 너의 이상한 fft 교대 또는 가늠자의. 'FFT' 함수로 무엇을 얻으 려하고 있습니까? –