用一个简单的例子理解 FFT 相位谱

信息处理 fft 傅里叶变换 Python 阶段
2022-02-06 18:38:36

我正在尝试使用 scipy 的函数计算 DFT。我不明白为什么具有 2 Hz 频率的简单正弦波的相位谱相反,相位图似乎对频率有一些线性依赖性,我不明白。我提供帮助代码。如何解决这个问题?看起来像一个简单的问题,我没有掌握。请帮忙。±π/2±2Hz

import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft, fftfreq

# 1Hz sine wave
npts  = 100
tmax  = 10                          
t     = np.linspace(0, tmax, npts)
y     = np.sin(2*np.pi*2*t)
dt    = tmax/npts

# FFT computation
Y      = fft(y)
freq   = fftfreq(npts, d=dt)
amplit = abs(Y)/npts
phase  = np.angle(Y)
phase  = phase / np.pi

fig, ax = plt.subplots(1, 2, figsize=(10,4))
ax[0].plot(freq, amplit)
ax[1].plot(freq, phase)

ax[0].plot([2,2], [0,0.5], '--')
ax[0].plot([-2,-2], [0,0.5], '--')
ax[1].plot([2,2], [-1,1], '--')
ax[1].plot([-2,-2], [-1,1], '--')

在此处输入图像描述

2个回答

对于在 FFT 长度上不完全是整数周期的正弦曲线,FFT 测量圆形不连续处的相位。当频率从略低于精确的整数周期孔径频率变为略高于精确的整数周期频率时,这种不连续性会翻转方向。这是任何有限长度 DFT 或 FFT 的默认矩形窗口效果的一部分。从而使频率扫描的 FFT 相位结果难以解释。

在圆形不连续处消除此测量的方法是通过在 FFT 之前执行(圆形)FFTShift 将波形不连续性从相位测量点(FFT 输入样本 0)移开。然后您的 FFT 相位结果将参考原始输入向量的中心(原始波形样本 N/2),对于连续输入函数或波形,该中心将是连续的。

在 fftshift 之后的 FFT 之后,您可以使用原始输入波形中心的 FFT 频率和相位结果来计算任何其他点的相位(例如原始输入波形的开始或样本 0。或结束, ETC。)。

正如@hotpaw2 所说,FFT 假定周期性边界条件,即右边的下一个点应该等于左边的第一个点。您的代码中并非如此,因为时间包含在您的时间数组中。因此,右边的下一点是并且你得到不连续性,因为您可以通过将时间数组定义为. 现在,此修复仅在时间跨度是信号周期的整数时才有效。如果不是,您将不得不依赖@hotpaw2 更通用的解决方案。t=10t=10+dty(10+dt)y(0)t=np.linspace(0, tmax, npts, endpoint=False)

PS:如果您的 scipy 版本允许,您应该使用较新的子模块 scipy.fft而不是旧的子模块scipy.fftpack