Фазовый спектр с питоном и БПФ - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь рассчитать фазовый спектр синусоиды.Следующий код генерирует синусоиду 1 Гц с нулевой начальной фазой.

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 Гц:

enter image description here

Показывает неправильную фазу гармоники 1 Гц.Что не так с кодом (или подходом)?

1 Ответ

1 голос
/ 11 июня 2019

Когда величина равна нулю, то фаза определяется числовой неточностью.

Если вы отобразите значения, вычисленные как fft, вы увидите, что значения, которые вы ожидаете равными 0, на самом деле имеют порядок 1e-16 или что-то в этом роде. Это численная неточность, вызванная округлением в вычислениях с плавающей точкой.

Решение состоит в том, чтобы вычислить как величину, так и фазу, и игнорировать фазовый компонент, если величина слишком мала.

...