我正在尝试查找离散时间数据集的n个谐波的傅立叶级数表示。数据最初不是周期性的,所以我对数据集进行了周期性扩展,结果可以在下面的波形中看到。
我试图在这个问题中复制解决方案:Calculate the Fourier series with the trigonometry approach 然而,我收到的结果没有产生正确的输出,如下图所示。似乎计算仅输出原始信号的偏移版本。
我正在使用的数据集是一个包含4060个元素的numpy数组。 如何正确计算和绘制离散数据集的傅立叶级数分解?
这是我使用的代码,它几乎与链接中引用的示例中的代码相同,只是已经进行了更改以适应我自己的信号数据。
# 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()