Я могу смущен тем, как правильно применять преобразование БПФ и его обратное в Matlab. У меня есть программа, где нужно, чтобыПутаница о fftshift и fft2 в MATLAB
- применяется FFT2 к матрице размера 4x32 (что соответствует режимам
m=-1:2
,n=-15:16
) - сделать некоторые обработки, что приводит к матрице коэффициентов для другой функции, чьи коэффициенты Фурье относятся к первому набору данных простой алгебраической (компонентной) формулой
- Используйте некоторые свойства двух функций, которые позволяют мне рассчитать, что мне нужно, просто суммируя выражение на форме
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-массивах, позже.)
Почему это? Что я здесь делаю неправильно?
Sure - это примерно такая же информация, как и то, что я получаю от документации Matlab. Однако почему я получаю заказ, который я показывал на этом посту, вместо того, что вы показываете? –
@TomasLycken: У вас есть тот же порядок, что и я сказал, вы только что пронумеровали свои данные -7 -> +8, а не более обычные -8 -> +7. –