python-3.x - 在 python 中,离散傅立叶变换不工作/效率非常低

  显示原文与译文双语对照的内容
87 1

我试着在 python 中编写一个离散的傅立叶变换函数,它将信号的能量谱密度作为 array ( 我将以图形方式输出) 。我是用矩阵乘法法做的。我的代码似乎适用于一小组数据,但需要很长时间处理一个 比如 文件。函数当前为:

from scipy.io import wavfile
import numpy as np
import matplotlib.pyplot as plt

( 数据,fs )?

a=[]
for i in range(int(np.size(data)/100)):
 dt = 1/(fs)
 fvec = np.arange(100*i, 100+(100*i), 1) 
 nvec = np.arange(0, np.size(data), 1)
 Wconst = np.exp(-1j*2*np.pi/np.size(data))
 ematrix = Wconst**(np.outer(fvec,nvec))
 b = (dt**2)*(abs(np.inner(ematrix, data))**2)
 a = np.concatenate((a,b))
return a

其中数据是数据集,fs是采样频率。这个函数是如此缓慢或者低效的原因是什么?它被设计用来处理信号的100块频率,否则矩阵将非常大。

时间:原作者:0个回答

70 3

算法通过计算Vandermonde频率矩阵,实现了"天真"离散傅里叶变换( DFT ) 。问题就在这里:

b = (dt ** 2) * abs(np.inner(ematrix, data)) ** 2

这个纯粹的实现使用直接矩阵向量乘法,并且有一个运行时间 O(N**2),它的中 N == data.size因这里,当你获得更大的数据时,它会更糟糕,并且可以能不会在合理的时间内完成。

这是利用快速傅里叶变换算法的整个点,利用了问题的大量结构。最明显的是,FFT将问题递归地分解为大小为 N/2的小问题。这种递归结构使得FFT的运行时间为 O(N log N)

原作者:
...