import numpy as np
import matplotlib.pyplot as plt
n = 500
T = 10
dw = 2 * np.pi / T
t = np.linspace(0, T, n)
x = 5 * np.sin(20 * t + np.pi) + 10 * np.sin( 40 * t + np.pi/2)
fftx = np.fft.rfft(x)
freq = np.fft.rfftfreq(n) * n * dw
amps = np.abs(fftx) * 2 / n
angs = np.angle(fftx)
_, ax = plt.subplots(3, 1)
ax[0].plot(t, x)
ax[1].plot(freq, amps)
ax[2].plot(freq, angs)
我获得了正确的频率和幅度值。但是从图中可以看出,相位值不正确。如何从fft中提取相位的正确值?我在相图中到底在看什么?
我期望频率20和40分别约为3.14和3.14 / 2。
答案 0 :(得分:1)
计算相位有两个问题:
您的输入信号不是整数个周期。如果重复复制信号,您会发现实际上与构建信号时假设的频率分量不同(DFT可以认为是使用信号的无限重复作为输入)。这会导致峰值具有一定的宽度,还会使相位偏移一点。
您可以通过开窗或创建信号使其具有整数个周期来解决此问题。后者是:
T = 3 * np.pi
t = np.linspace(0, T, n, endpoint=False)
没有信号的频率(在上述固定之后,除了两个频率之外,所有信号都为该频率),该相位将由噪声给出。您可以在此处将相位设置为零:
angs[amps < 1] = 0
现在您的情节看起来像这样:
相位不如您预期,因为正弦的相位为-π/ 2。使用cos
而不是sin
重复实验,您将获得预期的阶段。