如何使用numpy.fft获取正确的相位值

问题描述 投票:1回答:1
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)

enter image description here

我得到了正确的频率和幅度值。但从图中可以看出,相位值不正确。如何从fft中提取正确的相位值?我在相位图中究竟看到了什么?

我预计频率20和40分别约为3.14和3.14 / 2。

numpy fft
1个回答
1
投票

计算阶段有两个问题:

  1. 您的输入信号不是整数个周期。如果你重复复制信号,你会发现你实际上有一组不同于你构造信号时所假设的频率成分(DFT可以想象为使用无限重复的信号作为输入)。这会导致峰值具有一定的宽度,这也会导致相位稍微偏移。 您可以通过窗口化信号或创建信号以使其具有整数个句点来解决此问题。后者是: T = 3 * np.pi t = np.linspace(0, T, n, endpoint=False)
  2. 没有信号的频率(在上面的定位之后除了两个频率之外),相位将由噪声给出。您可以将此阶段设置为零: angs[amps < 1] = 0

现在你的情节看起来像这样:

plot

阶段不像您预期​​的那样,因为正弦的相位为-π/ 2。用cos而不是sin重复实验,你得到了你期待的阶段。

© www.soinside.com 2019 - 2024. All rights reserved.