如何用傅里叶变换做简单的外推?

信息处理 傅里叶变换 Python 傅里叶级数
2022-01-25 14:51:48

我有 1024 个样本点,我想使用傅里叶变换进行非常简单的外推。首先,我对数据应用快速傅立叶变换。我的第一个直觉是我只是在更大的间隔上计算傅立叶逆变换。FFT 的结果是正弦波的集合,所以我预计它的结果在原始间隔结束时是连续的。

我用这个公式计算结果:

X[k]=n=0N1x[n]ei2πnkN

区间末尾的外推如下所示:

外推误差

我想避免结果中出现这种“中断”。

python源代码为:

import numpy as np
import matplotlib.pyplot as plt

from scipy.fftpack import fft

# generate samples
data = np.zeros(1024)
for k in range(0, 1024):
    data[k] = np.sin(k/20 * np.pi*2)


# apply FFT on samples
waves = fft(data)

# calculate the new data points from the FFT result
res = np.zeros(2048)
for k in range(0, 2048):
    val = 0.0
    for n in range(0, len(waves)):
        # https://dsp.stackexchange.com/a/510/25943
        val += waves[n]*np.exp(1.j * 2*np.pi * n * k / len(waves)) / len(waves)
    res[k] = val.real

#plot the result
plt.plot(res)
plt.show()
1个回答

你的计算是正确的,但你的期望是错误的。

您用来扩展周期序列的方法,周期,在其基本周期之外,,到一个范围,比如说,将简单复制其旁边的基期除非最后一个和第一个元素相同,否则在周期边界处将存在不匹配(不连续性),您将其解释为故障。x~[n]N0n<N0n<2Nx[n]x[N1]x[0]

您实现的逆 DFT 是:

x[n]=1Nk=0N1X[k]ej2πNkn

当计算外推样本时, in,您将拥有:x[n0+N]n00n<N

x[n0+N]=1Nk=0N1X[k]ej2πNk(n0+N)=1Nk=0N1X[k]ej2πNkn0ej2πNN=x[n0]

正如预期的那样,由于在这种情况下旋转(复指数)的周期性。