Python,傅里叶离散数据系列

时间:2017-04-30 01:50:38

标签: python numpy signal-processing fft

我正在尝试查找离散时间数据集的n个谐波的傅立叶级数表示。数据最初不是周期性的,所以我对数据集进行了周期性扩展,结果可以在下面的波形中看到。

enter image description here

我试图在这个问题中复制解决方案:Calculate the Fourier series with the trigonometry approach 然而,我收到的结果没有产生正确的输出,如下图所示。似乎计算仅输出原始信号的偏移版本。

enter image description here

我正在使用的数据集是一个包含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()

0 个答案:

没有答案