Преобразование Фурье мучительно медленно - PullRequest
0 голосов
/ 10 июня 2019

Прежде чем меня судят, я не эксперт в этом, и просто ради любопытства я попытался написать некоторый код, который выполняет преобразование Фурье.После просмотра видео 3Blue1Brown о преобразовании Фурье я хотел сам написать алгоритм и построить его, просто потому что ... ну, это выглядит круто.Я пытался сделать все на чистом питоне только с использованием numpy и matplotlib, и это вроде как работает.

Примечание: я все итеративно черчаю и перерисовываю с каждым шагом

Но, чертязаворачивающаяся волна и преобразование очень-очень медленное.Я думаю, что я делаю некоторые вещи неэффективно, может даже неправильно.

Вот как это выглядит:

enter image description here

Вот код:

import numpy as np
import matplotlib.pyplot as plt

u = np.linspace(-8*np.pi, 8*np.pi, 1000)
sin1 = np.sin(u) + 2

u2 = np.linspace(-3*np.pi, 3*np.pi, 1000)
sin2 = np.sin(u2) + 2
plt.plot(u + u2, sin1 + sin2)
fig, (winder, integax) = plt.subplots(nrows = 2, ncols = 1)

L = len(sin1)
real = []
imag = []
integral = []

for val in np.arange(0.00001,360,0.00001):
    real = []
    imag = []
    for t,si in zip(np.arange(0,L,val),sin1 + sin2):
        complex = si * np.e ** (2 * np.pi * 1j * t)
        real.append(complex.real)
        imag.append(complex.imag)

    fig.set_size_inches(10,10)
    point = np.trapz(real)
    integral.append(point)
    #print(integral[-1], time[-1])
    integax.plot(integral)
    winder.plot(real, imag, 'b-')
    plt.pause(0.00001)
    winder.cla()

ax = plt.plot(real, imag, 'b-')
plt.show()

Теперь я хотел бы построить это быстрее, и я думаю, что часть интеграции не верна.Поскольку на результирующем графике не возникает пиков даже после долгого ожидания.

Я также не думаю, что я правильно использую linspace для построения синусоидальных волн, и я не делаю частотную часть прямо в формуле Фурье.

1 Ответ

0 голосов
/ 10 июня 2019

Компилирование комментариев в ответ:

Если я понял ваш код, вы используете числовую интеграцию с правилом трапеции.Если вы хотите вычислить преобразование Фурье и сделать это быстро, то вам, вероятно, следует реализовать алгоритм Быстрое преобразование Фурье .Обратите внимание, что БПФ (наряду с фильтром Калмана) считается одним из наиболее важных алгоритмов в разработке, и на то есть веская причина: он настолько быстрее, чем наивные реализации преобразования Фурье, что он превращает неразрешимые проблемы в требовательные к вычислениямно выполнимые продукты.

Как упомянуто be @ user2699, есть способы ускорить построение, согласно этому вопросу .

Это устраняет некоторые алгоритмические и связанные с Python узкие места вашего кода, но если вы недовольны скоростью, необходимой для запуска, начальная точка перехода должна быть профилирование вашего кода , инекоторые советы о том, как это сделать с Python, обсуждались в этом вопросе .

...