python实现fft并画图
时间: 2023-12-05 16:29:17 浏览: 246
可以使用Python中的NumPy库来实现FFT(快速傅里叶变换)并绘制图形。首先,导入NumPy和Matplotlib库,并定义一些参数和信号。可以参考以下代码实现FFT和绘图:
```python
import numpy as np
from matplotlib import pyplot as plt
# 定义参数和信号
pi = np.pi # 圆周率
fs = 1000 # 采样频率
dt = 1/fs # 采样周期
f1 = 10 # 信号的特征频率1
f2 = 100 # 信号的特征频率2
f3 = 200 # 信号的特征频率3
N = 2**12 # 离散信号的长度
tn = np.arange(0, dt*N, dt) # 时间序列
x = 2*np.cos(2*pi*f1*tn) + 2*np.cos(2*pi*f2*tn) + 2*np.cos(2*pi*f3*tn) # 生成离散信号
# FFT计算函数
def fft_calc(x, f_s, x_size, nfft):
w = np.hanning(nfft) # 加汉宁窗
cnt = x_size // nfft # 计算数据长度可以覆盖几个窗口
if cnt == 0: # 用0在数据尾部补齐
x_pad = np.pad(x, (0, nfft - x_size))
else:
x_pad = np.pad(x, (0, x_size - cnt * nfft))
cnt = len(x_pad) // nfft # 更新补齐的数据长度可以覆盖几个窗口
tmp = []
for i in range(cnt): # 窗与窗之间数据不重叠
p = np.fft.fft(w * x_pad[i * nfft:(i + 1) * nfft]) # 计算加窗的FFT并乘以调整系数
tmp.append(p) # 每个窗的结果
fft_result = np.mean(tmp, axis=0) # 将所有窗平均得到最终结果
amp = abs(fft_result)*2 / (nfft / 2) # 根据采样宽度计算幅值
amp /= 2 # 对直流分量额外调整
amp_half = amp[:int(len(amp) / 2) + 1 # 根据FFT特性,取一半频谱即可
freq = np.arange(int(len(amp) / 2) + 1) * f_s/nfft # 根据采样频率和采样点数,计算频率分辨率,并得到对应的频率坐标
return amp_half, freq
# 使用FFT计算函数并绘图
nfft = fs # FFT的窗长
(amp, freq) = fft_calc(x, fs, N, nfft)
# 绘制FFT结果图
fig = plt.figure(figsize=(12, 8))
plt.plot(freq, amp, color="blue")
plt.title('FFT result')
plt.xlabel('Freq /Hz')
plt.ylabel('urad/Hz')
ax = plt.gca()
plt.grid(which='both', axis='both')
plt.show()
```
以上代码将生成一个包含FFT结果图的图形窗口,横轴为频率(Hz),纵轴为幅度(urad/Hz)。
阅读全文