复傅里叶级数展开误差(Python)

2024-04-30 06:04:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着把脉冲函数展开成复傅里叶级数。请参见以下几乎正常工作的示例:

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()

上面的例子产生 enter image description here

一如预期。然而,当膨胀到1000个元素时,会发生一些非常奇怪的事情。所以键入plt.plot(t, rek_c(xp, t, dt, Tp, 1000 ), 'r')会产生这个(明显错误的)图: enter image description here

为什么?我该怎么纠正呢?你知道吗


Tags: importreturnplotdefasnpdtpi
1条回答
网友
1楼 · 发布于 2024-04-30 06:04:49

在仔细研究了一下您的代码之后,我发现了以下内容:

如果在标题中增加N,则可以处理更多元素N(rek_c的输入参数)。所以呢

K=N-1
plt.plot(t, rek_c(xp, t, dt, Tp,K ), 'r')

会给你最后一个可以接受的结果

K=N
plt.plot(t, rek_c(xp, t, dt, Tp,K ), 'r')

会给出第一个错误的结果。你知道吗

我们现在调用rek_c命令中的最后一个参数K,而N是在头文件中定义的网格点的数目。 我认为发生的事情是,你不能解释在一个比你的输入有网格点N更高的频率数K,(完全)离散傅里叶变换给你2N-1频率。对于K=N,你在2N个频率中展开,这是太多了。你知道吗

为了更详细的分析,有必要研究Nyquist frequency(离散数据的最高可能频率)和numpy.fft.fft。你知道吗

相关问题 更多 >