这里是将fft相图与2种不同方法进行比较的代码:
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()
这里是结果:
这里是周期的信号编号不是整数时的结果:
我有几个问题:
您可以通过在FFT之前执行fftshift(以N / 2循环旋转)来提取参考到数据窗口中心的相位。这是因为在进行fftshift之后,atan2()始终与数据中心周围数据的奇数与均匀度之比有关(分解为奇数函数加偶数函数)。
因此,请在生成窗口期间计算窗口中间信号的相位,并使用它代替开始时的相位。