2017-10-27 8 views
1

파이썬에서 이산 푸리에 변환 (DFT)을 사용해야하고 (역 DFT) 얻은 결과가 약간 이상해 보입니다. 따라서 작은 예제를 시도해 보았습니다. 실수 (수학 또는 코딩 인 경우).파이썬에서의 이산 푸리에 변환

from __future__ import division 
import numpy as np 
from pylab import * 

pi = np.pi 

def f(x): 
    return sin(x) 

theta = np.arange(0,2*pi,2*pi/4) 
k = np.arange(0,4,1) 

x = f(theta) 
y = np.fft.fft(x) 

derivative = np.fft.ifft(1j*k*y) 
print(derivative) 

그래서 내가 할 것은 0과 2pi 사이에 4 개 개의 다른 지점에서 죄를 샘플링하고이 숫자와 벡터 X를 만드는 것입니다 : 여기에 코드의 내 작은 버전입니다. 그런 다음 y를 얻기 위해 x의 DFT를 취합니다. 내가 원한 것은 선택된 지점에서 죄의 파생물을 얻는 것입니다. 그래서 이것을하기 위해 k (이 경우 0,1,2,3이 될 파수)와 허수 1j를 곱합니다 이것은 푸리에 (Fourier) 합계에서 각 용어에 대해 e^{ikx} 형태의 무언가가 있기 때문입니다. 그래서 결국 나는 1j의 역 DFT를 취합니다. k y 그리고 나는 죄의 파생물을 얻는다고 생각합니다. 그러나 내가 얻는 것은 이것입니다. 내가 반올림 오류를 무시하고이

[1,0,-1,0] 

을 얻을했는데

[ -1.00000000e+00 -6.12323400e-17j -6.12323400e-17 +2.00000000e+00j 
    1.00000000e+00 +1.83697020e-16j 6.12323400e-17 -2.00000000e+00j] 

. 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? 고맙습니다!

답변

1

역 FFT가 결과를 산출하는 것이면 스펙트럼 조작으로이 Hermitian 대칭을 보존해야합니다. 따라서 주파수 영역의 미분 연산자는 스펙트럼의 하반부에 정의되고 스펙트럼의 상반부는 대칭으로 구성됩니다. 심지어 자신의 대칭을해야 정확히 N/2에서 값을 크기 때문에 0 인 허수 부분이 있어야 스펙트럼이 참고 다음은이 미분 연산자를 구성하는 방법을 보여

N = len(y) 
if N%2: 
    derivative_operator = np.concatenate((np.arange(0,N/2,1),[0],np.arange(-N/2+1,0,1)))*1j 
else: 
    derivative_operator = np.concatenate((np.arange(0,N/2,1),np.arange(-N//2+1,0,1)))*1j 

당신이를 사용하는 것을 다음과 같은 주파수 영역에서 derivative_operator :

이 샘플의 경우
derivative = np.fft.ifft(derivative_operator*y) 

그런 다음 다음과 같은 결과를 얻을해야

[ 1.00000000e+00+0.j 6.12323400e-17+0.j 
    -1.00000000e+00+0.j -6.12323400e-17+0.j] 

은 예상 오차가 반올림 오차 이내입니다. [1,0,-1,0].