傅立叶变换速度极慢

时间:2019-06-10 11:50:09

标签: python numpy matplotlib dft

在我被判断之前,我对此并不熟练,只是出于好奇,我试图编写一些执行傅立叶变换的代码。看完3Blue1Brown's video on fourier transform之后,我想自己编写算法并对其进行绘图,这仅仅是因为...看起来很酷。我试图仅使用numpy和matplotlib在纯python中完成所有操作,并且可以正常工作。

注意:我正在迭代绘制所有内容,并以每个增量重新绘图

但是,绘制结束波和变换非常缓慢。我认为我在做某些事情时效率低下,甚至可能是错误的。

是这样的:

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 :(得分:0)

将评论汇编成答案:

如果我了解您的代码,则说明您正在使用带有梯形规则的数值积分。如果要计算傅立叶变换并快速完成,则可能应该实现Fast Fourier transform算法。请注意,FFT(连同卡尔曼滤波器)被认为是工程学中最重要的算法之一,并且有一个很好的理由:它比傅立叶变换的简单实现快得多,从而将棘手的问题转化为对计算的苛刻要求但可行的产品。

如@ user2699所述,根据this question,有一些方法可以加快绘图速度。

这解决了代码中与算法和Python相关的一些瓶颈,但是如果您对运行速度不满意,则应该以profiling your code作为起点,并提供一些有关如何执行此操作的提示this question中讨论了使用Python的问题。