这是一个比较两种不同方法的fft相位绘图的代码:
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack
phase = np.pi / 4
f = 1
fs = f*20
dur=10
t = np.linspace(0, dur, num=fs*dur, endpoint=False)
y = np.cos(2 * np.pi * t + phase)
Y = scipy.fftpack.fftshift(scipy.fftpack.fft(y))
f = scipy.fftpack.fftshift(scipy.fftpack.fftfreq(len(t)))
p = np.angle(Y)
p[np.abs(Y) < 1] = 0
fig, ax = plt.subplots(2, 1)
ax[0].plot(t, y)
ax[1].plot(f*fs, p, label='from fft')
ax[1].phase_spectrum(y, fs, window=None, label='from phase_spectrum')
plt.legend()
plt.show()
这是结果:
当周期信号数量不是整数时,以下是结果:
我有几个问题:
- 为什么使用phase_spectrum或fft和角度得到的相位图不同?使用fft然后np.angle可以得到好的结果,但是如何解释magnitude_spectrum的结果?
- 在这里我们有一个简单情况,我们有一个带有N个周期的正弦信号。如果我有一个宽频信号并且想要提取f处的相位,我该怎么做?例如,在这个例子中,使用两种方法,我不确定是否能够提取出精确的相位。使用phase_spectrum,在f = 1时无法找回pi/4。而使用fft和np.angle,为了提取正确的相位,我需要确保信号周期数是整数。