FFT 卷积仅适用于特定域长度

计算科学 一体化 傅里叶变换 卷积
2021-12-02 17:23:47

在我寻求了解如何使用 FFT 来计算积分的过程中(请参阅我的另一个问题click,仍然没有答案),我发现两个函数的卷积可以通过乘以函数的傅里叶变换并取该产品的逆变换。

现在假设我要计算

0Rxsin(yx)dx.
我可以把它写成卷积sin(x)xIndx<RInd作为给出适当积分边界的指示函数。

我的x向量在 N 个数据点上给出,在 0 和某个 L 之间等距,对于这 N 个点我也知道sin(x).

奇怪的是,如果L=2π,该方法似乎有效。但是用另一个 L,说L=1这是行不通的。这是什么原因,我该怎么办?

我已经阅读了关于零填充的方法,其中我将 N-1 个零添加到两个函数向量。那会有帮助吗?如果是这样,我想在 ifft 之后有一个原始大小为 N 的向量(这会给我一个 2N-1 的向量),这样我就可以得到每个 N 的卷积值x价值观。有没有办法做到这一点?

import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import fft, fftfreq, ifft

pi2 = 2 * np.pi 

N = 2001   ## should be odd!!
R = 0.2
L = 1

x = np.linspace(0, L-L/N, N)
f = np.sin(x)
g = x.copy()
g[g>R]=0      ## indicator function

# f=np.pad(f, (0, N-1), 'constant')   ## zero padding??
# g=np.pad(g, (0, N-1), 'constant')


F = fft(f)
G = fft(g)
C = (L/N)*ifft(F*G) 

analytic_sol = -np.sin(R-x)+R*np.cos(R-x)-np.sin(x)   ## analytic result

plt.plot(x, C, label="test")
plt.plot(x, analytic_sol, label="analytic",linestyle="--")
plt.legend()
plt.show()

在此处输入图像描述

请注意解决方案如何仅在 x=0.2=R 时才有效,即当指标函数变为零时。这里会发生什么?

0个回答
没有发现任何回复~