2011-04-30 134 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