我正在尝试计算正弦波的相位谱。 以下代码生成初始相位为零的1Hz正弦波。
import numpy
from numpy import pi, sin, arange
from pylab import plot, show, xlabel, ylabel, xlim, grid
sampling_rate = 500
sampling_time = 1 / sampling_rate
length = 1 # in seconds
n = sampling_rate * length # number of points
time = arange(0, n * sampling_time, sampling_time)
# Generate sinusoid: frequency=1Hz, phase=0
signal = sin(2 * pi * time)
fft = numpy.fft.fft(signal)
fft_phase = numpy.angle(fft)
fft_freq = numpy.arange(n) * sampling_rate / n
plot(fft_freq, fft_phase)
ylabel("FFT Angle")
xlabel("Frequency (Hz)")
xlim(left=0, right=5)
grid(True)
show()
但是结果不符合我的期望。它具有1 Hz分量的非零相位:
显示不正确的1 Hz谐波相位。代码(或方法)有什么问题?
答案 0 :(得分:1)
当幅度为零时,相位由数值不精确度给出。
如果显示由fft
计算的值,则会看到您期望为0的值实际上是1e-16或类似的值。这是浮点计算中舍入导致的数值不精确。
解决方案是同时计算幅度和相位,如果幅度太小,则忽略相位分量。