我试着把脉冲函数展开成复傅里叶级数。请参见以下几乎正常工作的示例:
import numpy as np
import matplotlib.pyplot as plt
Tp = 1
N = 1000
w = 0.05
t = np.linspace(-Tp/2, Tp/2, N)
dt = Tp/N
xp = np.zeros(N)
xp[abs(t) <= w*Tp] = 1
xp = xp + 0.0*(np.random.rand(N)-0.5)
def cn(x, t, dt, Tp, n):
return np.trapz(x*np.exp(-1j*2*np.pi*n*t/Tp),dx=dt)*1/Tp
def c(x, t, dt, Tp, N):
return [cn(x, t, dt, Tp, i) for i in range(-N,N)]
def rek_c(x, t, dt, Tp, N):
_c=c(x, t, dt, Tp, N)
out=np.zeros(len(x),dtype='complex')
for i in range(-N,N):
out += _c[N+i]*np.exp(1j*2*np.pi*(i)*t/Tp)
return out
plt.plot(t, xp)
plt.plot(t, rek_c(xp, t, dt, Tp,50 ), 'r')
plt.show()
一如预期。然而,当膨胀到1000个元素时,会发生一些非常奇怪的事情。所以键入plt.plot(t, rek_c(xp, t, dt, Tp, 1000 ), 'r')
会产生这个(明显错误的)图:
为什么?我该怎么纠正呢?你知道吗
在仔细研究了一下您的代码之后,我发现了以下内容:
如果在标题中增加N,则可以处理更多元素N(rek_c的输入参数)。所以呢
会给你最后一个可以接受的结果
会给出第一个错误的结果。你知道吗
我们现在调用rek_c命令中的最后一个参数K,而N是在头文件中定义的网格点的数目。 我认为发生的事情是,你不能解释在一个比你的输入有网格点N更高的频率数K,(完全)离散傅里叶变换给你2N-1频率。对于K=N,你在2N个频率中展开,这是太多了。你知道吗
为了更详细的分析,有必要研究Nyquist frequency(离散数据的最高可能频率)和numpy.fft.fft。你知道吗
相关问题 更多 >
编程相关推荐