离散傅立叶变换不是 working/very 在 python 中效率低下

Discrete Fourier Transform not working/very inefficient in python

我正在尝试在 python 中编写一个离散傅里叶变换函数,它将信号的能量谱密度作为数组给出(然后我将以图形方式输出)。我正在使用矩阵乘法来做到这一点。我的代码似乎适用于一小部分数据,但需要很长时间才能处理;对于大量数据,例如一个 wav 文件,它永远无法完成任务。当前函数是:

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

def esd(数据, 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

其中data是数据集,fs是采样频率。这个功能如此缓慢或低效是有原因的吗?它旨在处理 100 个频率块中的信号,否则矩阵会非常大。

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

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

这个简单的实现使用直接矩阵向量乘法,运行 时间为 O(N**2),其中 N == data.size。因此,当您获得更大的数据时,它会变得更糟,并且可能无法在合理的时间内完成您的 WAV 文件。

这就是使用快速傅立叶变换算法的全部要点,它利用了问题中的大量结构。最值得注意的是,FFT 将问题递归分解为更小的问题 N / 2。该递归结构使 FFT 的 运行 时间为 O(N log N).