Я пытаюсь найти представление ряда Фурье для n числа гармоник набора данных с дискретным временем. Данные изначально не являются периодическими, поэтому я выполнил периодическое расширение набора данных, и результат можно увидеть на осциллограмме ниже.
Я попытался воспроизвести решение в этом вопросе: Рассчитайте ряд Фурье с помощью тригонометрический подход Однако полученные мной результаты не дали надлежащего результата, как видно на рисунках ниже. Кажется, что вычисление просто выводит смещенную версию исходного сигнала.
Набор данных, с которым я работаю, представляет собой массив numpy с 4060 элементами. Как я могу правильно вычислить и отобразить разложение в ряд Фурье дискретного набора данных?
Вот код, который я использовал, он почти идентичен коду в примере, указанном в ссылке, за исключением того, что были внесены изменения, чтобы приспособить мои собственные данные сигнала.
# dat is a list with the original non periodic data
# persig is essentially dat repeated over several periods
# Define "x" range.
l = len(persig)
x = np.linspace(0,1,l)
print len(x)
# Define "T", i.e functions' period.
T = len(dat)
print T
L = T / 2
# "f(x)" function definition.
def f(x):
persig = np.asarray(persig)
return persig
# "a" coefficient calculation.
def a(n, L, accuracy = 1000):
a, b = -L, L
dx = (b - a) / accuracy
integration = 0
for x in np.linspace(a, b, accuracy):
integration += f(x) * np.cos((n * np.pi * x) / L)
integration *= dx
return (1 / L) * integration
# "b" coefficient calculation.
def b(n, L, accuracy = 1000):
a, b = -L, L
dx = (b - a) / accuracy
integration = 0
for x in np.linspace(a, b, accuracy):
integration += f(x) * np.sin((n * np.pi * x) / L)
integration *= dx
return (1 / L) * integration
# Fourier series.
def Sf(x, L, n = 5):
a0 = a(0, L)
sum = np.zeros(np.size(x))
for i in np.arange(1, n + 1):
sum += ((a(i, L) * np.cos((i * np.pi * x) / L)) + (b(i, L) * np.sin((i * np.pi * x) / L)))
return (a0 / 2) + sum
plt.plot(x, f(x))
plt.plot(x, Sf(x, L))
plt.show()