#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 также не будет работать… это список.