Python 给出与使用公式计算的dft不同的输出的Numpy fft函数

Python 给出与使用公式计算的dft不同的输出的Numpy fft函数,python,numpy,signal-processing,fft,dft,Python,Numpy,Signal Processing,Fft,Dft,我正在尝试用python实现dft。我使用的是标准公式: 这是我的密码: k = np.array([np.arange(-50, 50)]) fs, xn = wavfile.read('voice_recording.wav') nbits = 16 max_nbits = float(2**(nbits-1)) xn = xn / (max_nbits + 1.0) xn = np.expand_dims(xn[:,0], axis=1) N = len(xn) n = np.array

我正在尝试用python实现dft。我使用的是标准公式:

这是我的密码:

k = np.array([np.arange(-50, 50)])
fs, xn = wavfile.read('voice_recording.wav')
nbits = 16
max_nbits = float(2**(nbits-1))
xn = xn / (max_nbits + 1.0)
xn = np.expand_dims(xn[:,0], axis=1)
N = len(xn)
n = np.array([np.arange(0, N)])
Xk = np.sum(xn*np.exp(((-1j*2*math.pi)/N)*np.matmul(n.T, k)), axis=0)
这里,xn是从.wav文件读取的音频信号。FFT的代码为:

Xk1 = np.fft.fftshift(np.fft.fft(xn, n=100, axis=0))
但两种结果完全不同,尽管它们应该是相同的。 DFT图:

和FFT图:


我做错了什么?

如果不下载您的数据文件,我估计它有100多个样本。如果是,那么

np.fft.fft(xn, n=100, axis=0)
切断前100个样本并计算这些样本的FFT。也就是说,它不会计算与代码相同的内容

当我使用xn=np.random.randn100并运行代码时,Xk和Xk1在1e-13左右都是相同的。这表明您的代码是正确的

要使用FFT算法仅计算k值的子集,请首先计算完整变换,然后丢弃不需要的值。例如:

Xk1 = np.fft.fft(xn, axis=0)
Xk1 = np.fft.fftshift(Xk1)
Xk1 = Xk1[(N//2 - 50):(N//2 + 50)]

什么是xn?它是在哪里定义的?@severinpapadeux是一个numpy数组。它是从.wav文件读取的。如果您在一行代码中执行了太多的操作,则很难看到它的功能,也很难进行调试。您应该编写代码以便易于阅读。接下来,查看中间结果,确保每个结果都如您所期望的那样。您很快就会发现您的bug。@CrisLuengo well使用矩阵计算的效率并不比Python循环更高。它使用C循环,我不建议添加循环。我建议写简短的陈述。一行中有太多的括号,无法轻松地分辨exp调用中包含的内容和未包含的内容!您无法检查np.matmul的结果是否符合预期。np.exp的结果是否符合您的预期?现在,您无法判断是否逐行运行代码。将其拆分,以便可以看到中间结果。输出的维度是否应等于k?当我们对wrt n求和时?是函数x[n]或x[k]的输出?@ShantanuShinde:您的代码可以计算任意k的DFT,它独立地计算每一个。FFT算法必须同时计算它们。它无法计算子集。你必须计算整个fftxn,axis=0,然后选择你想要查看的100个元素。当我取k和n相等时,输出与fft输出匹配。那么,你能建议我如何实施FFT换档吗?