[英]Phase spectrum with python and 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 # 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左右。 這是浮點計算中舍入導致的數值不精確性。
解決方案是同時計算幅度和相位,如果幅度太小,則忽略相位分量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.