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

时间:2015-03-16 13:40:11

标签: fft scilab dft

我是傅立叶变换的新手,所以我希望有人可以提供帮助! 我想计算傅里叶变换的波矢,这就是我做这个测试程序的原因。 基本上我有矢量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应该是一个真正的向量。但它实际上是一个复杂的载体。我认为错误发生在波矢[{1}}中,但我不知道正确的答案。

1 个答案:

答案 0 :(得分:1)

好的,我找到了:

当scilab执行fft时,freq-space中的数据将被交换。有时,没有问题,因为如果您在ifft之后使用fftifft函数将撤消交换。但是,如果您的目标不是在ifft之后使用fft,或者您必须使用某些非交换向量来生成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$(最后一个向量)的卷积,而不是{{1 }}。如果从i=1升级到i=1,请删除$条款。