FFT是DFT的高效版本实现,原理没什么差别,所以这里实现DFT。
-
首先DFT的公式为:
-
那么我们就用python实现一下吧
zzy_fft就是我手动实现的toy版本的fft
import numpy as np
import matplotlib.pyplot as plt
def zzy_fft(x, N):
# 根据dft式子写的简易版本fft,只是大概验证一下他的原理
# x是原始列表,N是列表里元素个数
# 返回ret列表是枚举每个频率,计算得到的“质心”
ret = []
for k in range(1000): # k是枚举的频率
tmp = 0 + 0j
for n in range(N): # 欧拉公式
# 注意sin是负号,因为dft公式里是-i
tmp += np.complex(np.cos(2*np.pi*n*k/N) * x[n], -np.sin(2*np.pi*n*k/N) * x[n])
ret.append(tmp)
return ret
t = np.linspace(0, 1, 1000)
f = np.sin(30*2*np.pi*t) + np.cos(20*2*np.pi*t)
# solution 1 : zzy
y = zzy_fft(f, 1000)
y = np.fft.fftshift(y)
plt.plot(y)
plt.show()
# solution 2 : numpy
# y = np.fft.fft(f)
# y = np.fft.fftshift(y)
# freq = np.fft.fftfreq(f.shape[0], d=(t[1]-t[0]))
# freq = np.fft.fftshift(freq)
# plt.plot(freq, np.abs(y))
# plt.show()