绘制和提取fft相

问题描述 投票:1回答:1

这里是将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()

这里是结果:

enter image description here

这里是周期的信号编号不是整数时的结果:

enter image description here

我有几个问题:

  • 为什么相位图与phase_spectrum或使用fft和角度如此不同?先使用fft再使用np.angle会产生良好的结果,但是我们如何解释幅度谱结果?
  • 这里我们处于非常简单的情况,其中we have sine periodic signal with N periods因为如果我有一个宽幅信号并且想要在f处提取相位,我该怎么办?例如,在此使用示例中介绍的两种方法,我不确定是否可以提取出精确的相位。使用phase_spectrum,在f = 1时我找不到pi / 4。然后使用fft然后使用np.angle,为了提取良好的相位,我需要确保period的信号数是整数。
python numpy fft phase
1个回答
0
投票

您可以通过在FFT之前执行fftshift(以N / 2循环旋转)来提取参考到数据窗口中心的相位。这是因为在进行fftshift之后,atan2()始终与数据中心周围数据的奇数与均匀度之比有关(分解为奇数函数加偶数函数)。

因此,请在生成窗口期间计算窗口中间信号的相位,并使用它代替开始时的相位。

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