2012-05-23 3 views
0

Я могу смущен тем, как правильно применять преобразование БПФ и его обратное в Matlab. У меня есть программа, где нужно, чтобыПутаница о fftshift и fft2 в MATLAB

  1. применяется FFT2 к матрице размера 4x32 (что соответствует режимам m=-1:2, n=-15:16)
  2. сделать некоторые обработки, что приводит к матрице коэффициентов для другой функции, чьи коэффициенты Фурье относятся к первому набору данных простой алгебраической (компонентной) формулой
  3. Используйте некоторые свойства двух функций, которые позволяют мне рассчитать, что мне нужно, просто суммируя выражение на форме 2*abs(A_n)*cos(phi+n*theta+alpha_n), где A_n - n-й коэффициент режима m=1 и alpha_n = arg(A_n).

Я немного экспериментировал с функцией FFT2 и попытался понять, как он упорядочивает его выход. Из того, что я понимаю (из источников в моей курсовой литературе), коэффициенты будут упорядочены, как показано на следующем примере:

>>m = -1:2; n = -7:8; 
>>[N,M] = meshgrid(n,m); 
>>MN = M; MN(:,:,2) = N; 
>>asfft = @(X) [X(2:4,8:16,:) X(2:4,1:7,:); X(1,8:16,:) X(1,1:7,:)]; 
>>asfft(MN) 
ans(:,:,1) = 
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
    1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
    2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2 
    -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
ans(:,:,2) = 
    0  1  2  3  4  5  6  7  8 -7 -6 -5 -4 -3 -2 -1 
    0  1  2  3  4  5  6  7  8 -7 -6 -5 -4 -3 -2 -1 
    0  1  2  3  4  5  6  7  8 -7 -6 -5 -4 -3 -2 -1 
    0  1  2  3  4  5  6  7  8 -7 -6 -5 -4 -3 -2 -1 

где asfft перестраивает индексы таким же образом, я считаю, fft2 делает, но ничего не делает остальное. Другими словами, каждый индекс упорядочен от 0 до макс, а затем от минус до -1. Согласно документации, я должен иметь возможность изменить это так, чтобы получить 0 в середине, используя fftshift, но это не дает мне результат, который я ожидаю. Вместо этого, я получаю это:

>> fftshift(asfft(MN)) 
ans(:,:,1) = 
    8 -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7 
    8 -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7 
    8 -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7 
    8 -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7 
ans(:,:,2) = 
    2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2 
    -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
    1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 

Как вы можете видеть, максимум находится на неправильной стороне спектра - вместо -7 -6 ... -1 0 1 ... 8 и -1 0 1 2 меня 8 -7 6 ... и 2 -1 0 1. Это для меня смертельно, так как для выполнения вычисления, описанного выше в 3, мне нужно знать индексы соответствующих коэффициентов. (Два слоя также переключаются, но это не имеет значения для меня, так как я буду делать это только на матрицах MxN, а не на N-d-массивах, позже.)

Почему это? Что я здесь делаю неправильно?

ответ

3

Учитывая простой 1D случай первый, fft дает:

[X(0) X(1) X(2) ... X(N/2-1) X(-N/2) X(-N/2+1) ... X(-1)] 

где я использую X(k) для обозначения элементов mathematical DFT.

Все fftshift делает поворачивать их на N/2, так что вы в конечном итоге с:

[X(-N/2) X(-N/2+1) ... X(-1) X(0) X(1) X(2) ... X(N/2-1)] 

т.е. линейного порядка.

В многомерном случае fftshift просто применяет это вращение во всех измерениях.


1. Несмотря на то, поскольку, по определению, X(k) == X(N+k) для ДПФ, то повёрнутый вектор также в «линейном» порядке!

+0

Sure - это примерно такая же информация, как и то, что я получаю от документации Matlab. Однако почему я получаю заказ, который я показывал на этом посту, вместо того, что вы показываете? –

+2

@TomasLycken: У вас есть тот же порядок, что и я сказал, вы только что пронумеровали свои данные -7 -> +8, а не более обычные -8 -> +7. –

-1

принимая очередь от Оли, проблема заключается в том, что вы не разбор его в середине:

так для asfft = @(X) [X(2:4,8:16,:) X(2:4,1:7,:); X(1,8:16,:) X(1,1:7,:)];

size(8:16) 
ans = 
    1  9 
size(1:7) 
ans = 
    1  7 

так сделать:

asfft = @(X) [X(3:4,9:16,:) X(3:4,1:8,:); X(1:2,9:16,:) X(1:2,1:8,:)]; 
+0

Будет ли это соответствовать тому, как FFT2 заказывает мои коэффициенты? –

+0

Как указал oli, вам также нужно сделать m = -2: 1; n = -8: 7; 'и вы должны быть там – Rasman

+0

Это не вариант, учитывая физический эксперимент, из которого я использую данные. Я обновил свой пост, чтобы прояснить это. –

Смежные вопросы