基于python和FFT的相位谱分析

基于python和FFT的相位谱分析,python,numpy,signal-processing,fft,Python,Numpy,Signal Processing,Fft,我想计算正弦信号的相位谱。 以下代码生成初始相位为零的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 # numb

我想计算正弦信号的相位谱。 以下代码生成初始相位为零的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谐波的相位不正确。代码(或方法)有什么问题?

当幅值为零时,相位由数值不精确给出

如果显示通过
fft
计算的值,您将看到预期为0的值实际上是1e-16或类似的顺序。这是由于浮点计算中的舍入导致的数值不精确


解决方案是计算幅值和相位,如果幅值太小,则忽略相位分量。

1Hz分量的幅值不是零。我同意你写的其他东西。但这并不能解释1Hz分量的不正确相位。@t时间:似乎和预期的一样是-pi/2。余弦的相位为0。