2011-04-30 4 views
3

이산 푸리에 변환에서 함수를 다시 만들려고합니다. 매트랩 그것은 다음과 같이 할 것입니다 :이산 푸리에 변환에서 푸리에 시리즈

function [y] = Fourier(dft,x) 
n = length(dft); 
y = cos(pi*(x+1)'*(0:n-1))*real(dft)+sin(pi*(x+1)'*(0:n-1))*imag(dft) 
end 

내가 제대로

def reconstruct(dft, x): 
n = len(dft) 
y = ([(coeff.real)*np.cos(np.pi*x*nn) + (coeff.imag)*np.cos(np.pi*x*nn) for coeff in dft for nn in range(0,n)]) 

모든 계수를 추가하는 방법을 모르기 때문에 파이썬 내 시도가 평평하게 떨어지고 그러나이 정확하지 않습니다 n 이상을 합하여 그 합을 더해야하기 때문입니다. 나는 어디에서 떨어져 있니?

내가 다시하려고 방정식

은 다음과 같습니다 :

Fourier Series

+0

첫 번째 스 니펫에서'fhi' 대신'dft'를 사용 하시겠습니까? – highBandWidth

+0

감사합니다. 그것을 정정했다. – drinck

답변

5

당신은 하나가 아닌 두 개의 중첩 루프를 실행했다. 이것을 시도하십시오 :

y = ([(dft[nn].real)*np.cos(np.pi*x*nn) + (dft[nn].imag)*np.cos(np.pi*x*nn) for nn in range(0,n)]) 
4

실제로 파이썬 루프를 사용해서는 안됩니다. 표현을 벡터화하면 더 읽기 쉽고 훨씬 효율적인 코드를 얻을 수 있습니다. 복소수 NumPy와 배열, 당신은

xn = x * np.arange(n) 
y = dft.real * np.cos(xn) + dft.imag * np.sin(xn) 

를 사용할 수 dft이다 가정 (당신의 MATLAB 코드, 파이썬 코드와 당신이 세 가지 일을했다 수식. 내가 준 코드는 MATLAB 코드에 가장 가까운합니다 .)

+0

나는 보통 그렇게하지만, 문제는 특이점이있는 단계 함수 (표시되지 않음)이기 때문에 문제가 발생했습니다. 그것은 '하나 이상의 요소를 가진 배열의 진리 값은 모호합니다. a.any() 또는 a.all() '을 사용하면 dft.real도 작동하지 않습니다 ... 목록입니다. – drinck

관련 문제