2011-04-30 187 views
3

我試圖從離散傅立葉變換中重新創建一個函數。在Matlab中它會做這樣的:來自離散傅里葉變換的傅立葉級數

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 

我在Python試圖倒平,因爲我不知道如何添加了所有的係數正確

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

你的意思是'dft'而不是'fhi'在第一個片段中? – highBandWidth 2011-04-30 02:18:03

+0

謝謝。更正它。 – drinck 2011-04-30 02:41:52

回答

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

你實際上不應該使用Python循環。如果引導表達式,可以獲得更多可讀性和更高效的代碼。假設dft是一個複數NumPy的數組,你可以使用

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

(請注意,您的MATLAB代碼,Python代碼,你給做的三個不同的事情的公式。我給的代碼是最接近Matlab代碼)

+0

我通常這樣做,但我遇到了麻煩,因爲這個函數是一個帶有奇點的階梯函數(未顯示)。它給了我'具有多個元素的數組的真值是不明確的。使用a.any()或a.all()',dft.real也不會工作...這是一個列表。 – drinck 2011-05-01 13:47:40