2016-01-21 1 views
0

и пытаюсь связать fftshift/ifftshift с круговым сдвигом.fftshift/ifftshift в терминах circshift

N = 5 
Y = 0:N-1 

X = [0 1 2 3 4] 

Когда я fftshift (X), я получаю

[3 4 0 1 2] 

Когда я ifftshift (X), я получаю

[2 3 4 0 1] 

Как связать fftshift/ifftshift для циклического сдвига? Это просто перемещение чисел в X в разных направлениях?

Мне нужно знать это, поскольку я пытаюсь реализовать эти две функции в терминах кругового сдвига в C++, что является функцией, которую я уже сделал.

Большое спасибо.

+2

Просто введите 'open fftshift' и' open ifftshift' в окне команд. Оба не имеют встроенных функций. Они запрограммированы с использованием 'circshift'. Вы можете просто приспособиться к коду для вас на C++-программе. – Nemesis

+0

@ Немезида спасибо, я не знал, что вы можете это сделать. Понятно, что между ними существует только одно различие - то, как он определяет, где поменять слева и справа от матрицы. Для fftshift используется ceil (N/2), тогда как ifftshift использует пол (N/2). – lppier

ответ

1

После просмотра кодов Matlab, которые непосредственно не используют круговой сдвиг, а скорее синтаксис Matlab.

Скажите N = нет. элементов

Для реализации fftshift,

circularShiftRightBy = floor(N/2) 

Для реализации ifftshift,

circularShiftRightBy = ceil(N/2) 

Being N/2, есть только разница между fftshift и ifftshift, если N нечетно.

Где код кругового сдвига:

template<typename ty> 
void circshift(ty *out, const ty *in, int xdim, int ydim, int xshift, int yshift) 
{ 
for (int i =0; i < xdim; i++) { 
    int ii = (i + xshift) % xdim; 
    if (ii<0) ii = xdim + ii; 
    for (int j = 0; j < ydim; j++) { 
    int jj = (j + yshift) % ydim; 
    if (jj<0) jj = ydim + jj; 
    out[ii * ydim + jj] = in[i * ydim + j]; 
    } 
} 
} 

(редактировался fftshift/ifftshift C/C++ source code для поддержки левых (-ve) сдвиг, а также.)

EDIT: Я с тех пор нашел лучший способ сделать это: https://kerpanic.wordpress.com/2016/04/08/more-efficient-ifftshift-fftshift-in-c/