具有高斯函数的傅里叶变换的卷积



我是傅里叶变换的新手,所以我希望有人能提供帮助!我想计算傅里叶变换的波矢量,这就是我做这个测试程序的原因。基本上我有矢量u.我应用傅里叶变换来制作向量uf。然后我应用一个带有高斯函数的卷积。Scilab 中的代码如下所示

u = [0.1 -0.1 -0.1 -0.1 0.1 0.1 -0.1 0.1 0.1 -0.1];
sizeu = size(u,'*');
// wave vector
for i=1:sizeu
   q(i) = (i-1) * 2 * %pi / sizeu;
end
// forward transform
uf = fft(u);
// convolution with a Gaussian function
for i=2:sizeu
   vf(i) = uf(i)*exp(-q(i)*q(i));
end
// backward transform
v = ifft(vf);

所以我相信结果,即向量v应该是真实的向量。但它实际上是一个复杂的向量。我认为错误出在波矢量q但我不知道正确答案。

好的,我找到了:

当scilab执行fft时,频率空间中的数据被交换。有时,没有问题,因为如果您在fft后使用ifftifft函数将撤消交换。但是,如果你的目标不是在fft后使用ifft,或者你必须用一些非交换向量做一个fft变换函数的乘积,你就会遇到麻烦,因为函数的频率分量不匹配。解决方案是交换高斯函数以将其值与测试函数匹配,使用 fftshift 。不要撤消测试函数的交换以匹配高斯函数,因为当您执行ifft时,此函数将撤消交换。所以,这是正确的代码:

u = [0.1 -0.1 -0.1 -0.1 0.1 0.1 -0.1 0.1 0.1 -0.1];
sizeu = size(u,'*');
// wave vector
q = (0:sizeu-1) * 2 * %pi / sizeu;
// forward transform
uf = fft(u);
// convolution with a Gaussian function
   vf(2:$) = uf(2:$).*fftshift(exp(-q(2:$).*q(2:$)));

// backward transform
v = ifft(vf);

我清理了一些不必要的for,不明白为什么你从i=2$(向量的最后一个数字)而不是从i=1进行卷积。如果从i=1$,请删除(2:$)术语。

最新更新