【发布时间】:2020-03-17 12:44:36
【问题描述】:
下面的 FFT 代码没有给出类似于 Python 的scipy 库的结果。但我不知道这段代码有什么问题。
import numpy as np
import matplotlib.pyplot as plt
#from scipy.fftpack import fft
def omega(p, q):
return np.exp((-2j * np.pi * p) / q)
def fft(x):
N = len(x)
if N <= 1: return x
even = fft(x[0::2])
odd = fft(x[1::2])
combined = [0] * N
for k in range(N//2):
combined[k] = even[k] + omega(k,N) * odd[k]
combined[k + N//2] = even[k] - omega(k,N) * odd[k]
return combined
N = 600
T = 1.0 / 800.0
x = np.linspace(0, N*T, N)
#y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
y = np.sin(50.0 * 2.0*np.pi*x)
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)
yf = fft(y)
yfa = 2.0/N * np.abs(yf[0:N//2])
plt.plot(xf, yfa)
plt.show()
这给出了:
【问题讨论】:
-
您已正确实施,但尚未完全优化。 FFT 基本上是函数的能量。所以你可能会得到一点点的失真。如果想看实际实现请参考github.com/scipy/scipy/blob/master/scipy/fftpack/basic.py
-
绘制 scipy 版本。差异应该很小。根据您对计算的排序和优化方式,舍入误差会在不同的地方蔓延。
标签: python numpy matplotlib scipy fft