Ряд Фурье из дискретного преобразования Фурье

#python #numpy

#python #numpy

Вопрос:

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

Уравнение, которое я пытаюсь воссоздать, приведено ниже:

Ряды Фурье

Комментарии:

1. Вы имеете в виду dft вместо fhi в первом фрагменте?

Ответ №1:

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

 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)])
  

Ответ №2:

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

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

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

Комментарии:

1. Обычно я это делаю, но у меня возникли проблемы, потому что функция является ступенчатой функцией (не показана) с особенностями. Это дало мне ‘Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()’ и dft.real также не будет работать… это список.