我比较了Matlab和numpy中的相位和幅度谱。我认为Matlab可以正常工作,但是numpy计算出正确的幅度谱,但是相位谱很奇怪。我必须如何更改numpy的python代码才能正确计算fft?
Matlab:
fs = 1e4;
dt = 1 / fs;
t = 0:dt:0.5;
F = 1e3;
y = cos(2*pi*F*t);
S = fftshift(fft(y) / length(y));
f_scale = linspace(-1, 1, length(y)) * (fs / 2);
a = abs(S);
phi = (angle(S));
subplot(2, 1, 1)
plot(f_scale, a)
title('amplitude')
subplot(2, 1, 2)
plot(f_scale, phi)
title('phase')
Python:
import numpy as np
import matplotlib.pyplot as plt
fs = 1e4
dt = 1 / fs
t = np.arange(0, 0.5, dt)
F = 1e3
y = np.cos(2*np.pi*F*t)
S = np.fft.fftshift(np.fft.fft(y) / y.shape[0])
f_scale = np.linspace(-1, 1, y.shape[0]) * (fs / 2)
a = np.abs(S)
phi = np.angle(S)
plt.subplot(2, 1, 1, title="amplitude")
plt.plot(f_scale, a)
plt.subplot(2, 1, 2, title="phase")
plt.plot(f_scale, phi)
plt.show()
答案 0 :(得分:3)
理解np.arange
时出现问题。它会在达到所需值之前dt
停止(您通过的间隔在右侧打开)。如果您定义
t = np.arange(0, 0.5+dt, dt)
一切正常。
答案 1 :(得分:3)
正如另一个答案中指出的那样,要使Python绘图与matlab输出匹配,您必须调整t
数组,使其具有与matlab代码中的t
数组相同的值。 / p>
但是,如果您打算在信号中使用整数个周期,那么FFT只有两个非零值(在±输入频率处),那么Python代码才是正确的。 Python代码中的相位看起来很奇怪,因为除与信号频率相关的傅立叶系数外,所有傅立叶系数都(理论上)为0。使用有限精度算术,这些系数最终成为具有很小幅度且基本上是随机相位的数字“噪声”。 / p>