Ряд Фурье из дискретного преобразования Фурье - PullRequest
3 голосов
/ 30 апреля 2011

Я пытаюсь воссоздать функцию из дискретного преобразования Фурье. В 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

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

На самом деле вы вообще не должны использовать цикл Python.Вы получите более читаемый и намного более эффективный код, если векторизоваете выражение.Предполагая, что dft является комплексным массивом NumPy, вы можете использовать

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

(Обратите внимание, что ваш код Matlab, ваш код Python и формула, которую вы дали, делают три разные вещи. Код, который я дал, наиболее близокк коду Matlab.)

5 голосов
/ 30 апреля 2011

Вы запустили два вложенных цикла вместо одного.Попробуйте это:

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)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...