使用 Python 在任意点评估傅立叶系数

信息处理 傅里叶变换 Python
2022-02-07 19:16:53

假设我有一个看起来像s

import numpy as np
import matplotlib.pyplot as plt

s = lambda t: np.sin(2 * np.pi * t / 13)
s_sampled = np.array([s(i) for i in range(50)])
plt.plot(s_sampled)

在此处输入图像描述

现在我想对信号进行离散傅里叶变换并重建整个原始信号。由于信号只有 13 个周期。对前 13 个点进行傅里叶变换应该足够了。

fourier_coefficients = np.fft.fft(s_sampled[:13])

但是,使用 numpy 的逆变换我只能得到 13 分。

plt.plot(np.fft.ifft(fourier_coefficients))

在此处输入图像描述

我怎样才能得到其余的(现在只是重复的)信号?我试图自己构建一个函数,但它并不完全奏效......

def inverse_fourier(x, t):
"""Evaluate Fourier coefficients at point t.

Args:
    x: The Fourier coefficients.
    t: The time point at which to evaluate the function.
"""
x = x.flatten()
n = len(x)
k = np.arange(n)
y = x @ np.exp(2j * np.pi * t * k / n)

return y / n

plt.plot(np.array([inverse_fourier(fourier_coefficients, t) for t in range(50)]))

提供有关该问题的更多详细信息。我想取不同正弦曲线之间随时间变化的信号之间的近似差异,但本质上是相移的。所以我的想法是取最后个时间点,估计傅里叶系数,取傅里叶空间中的差异,并评估由时间点的系数表示的结果函数。因此,我想知道如何评估处的系数。我知道我在其间变化的信号的周期,因此可以返回足够的点来捕获所有相关频率。kttk

1个回答

也许我错过了一些东西。在您的代码中,设置

ic =  np.fft.ifft(fourier_coefficients)

并测试

np.linalg.norm(ic - s_sampled[0:13])
# Answer is really small, indicating that these two vectors are equal

这表明您准确地获得了前 13 个元素。

进一步,测试

np.linalg.norm(ic - s_sampled[13:26])
# These two vectors are also equal

因此,s_sampled 由 ic 组成,重复多次。

究竟缺少什么?

PS:您的问题中的代码存在错误。

s_sampled = np.array([p1(i) for i in range(50)])

应该

s_sampled = np.array([s(i) for i in range(50)])