Свертка преобразования Фурье с функцией Гаусса

Я новичок в преобразовании Фурье, поэтому надеюсь, что кто-то может помочь! Я хочу рассчитать волновой вектор преобразования Фурье, поэтому я делаю эту тестовую программу. В основном у меня есть вектор 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, но я не знаю правильного ответа.


person academic    schedule 16.03.2015    source источник


Ответы (1)


Хорошо, я нашел это:

Когда scilab выполняет fft, данные в частотном пространстве меняются местами. Иногда проблем не возникает, потому что если вы используете 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 до $ (последний номер вектора), а не от i=1. При переходе от i=1 к $ удалите (2:$) условий.

person Betson    schedule 15.05.2015