我正在尝试在 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 频率矩阵来实现“朴素”离散傅立叶变换 (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)

关于python - 离散傅立叶变换在python中不起作用/效率很低,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47660194/

10-12 03:49