我是傅立叶变换的新手,所以我希望有人可以提供帮助!
我想计算傅里叶变换的波矢,这就是我做这个测试程序的原因。
基本上我有矢量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}}中,但我不知道正确的答案。
答案 0 :(得分:1)
好的,我找到了:
当scilab执行fft
时,freq-space中的数据将被交换。有时,没有问题,因为如果您在ifft
之后使用fft
,ifft
函数将撤消交换。但是,如果您的目标不是在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
,请删除$
条款。