Разложение 3D БПФ с использованием 1D БПФ в измерении z - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть 3D матрица:

A = [5 7 8; 0 1 9; 4 3 6];
A(:,:,2) = [1 0 4; 3 5 6; 9 8 7]

Я хочу применить 3D БПФ в этой матрице, используя разложение 1D БПФ. Я прочитал, что это я должен применять 1D FFT в каждом измерении.

Как я могу это сделать?

Для x и y я делаю это:

for k=0:2
    y1 = A(:,k+1,:);
    A(:,k+1,:) = fft(y1);
end

for k=0:2
    y2 = A(k+1,:,:);
    A(k+1,:,:) = fft(y2);
end

Для измерения z я не знаю, как это сделать.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Сначала , ваши циклы должны выглядеть так:

for k=1:size(A,2)
    y = A(:,k,:);
    A(:,k,:) = fft(y);
end

Второй , цикл выше идентичен (как сказал @Luis Mendo в своем ответе):

A = fft(A,[],2);

Нет необходимости писать цикл вообще.

Третий , для вычисления 1D БПФ по 3-му измерению вы используете:

fft(A,[],3);

Вы могли бы написать это как цикл (просто чтобы ответить на ваш явный вопрос, я не рекомендую вам делать это):

for k=1:size(A,3)
    y = A(:,:,k);
    A(:,:,k) = fft(y);
end

Если по какой-то причине это не работает в вашей версии MATLAB из-за формы y, вы можете изменить y на вектор-столбец:

... fft(y(:));

Наконец , чтобы вычислить 3D БПФ с использованием 1D-разложений, вы можете просто написать

A = fftn(A);

Это точно такой же процесс, который вы пытаетесь реализовать, за исключением того, что он делает это намного быстрее.

0 голосов
/ 27 апреля 2018

Функция fft принимает третий входной параметр, определяющий размер, и векторизируется относительно других измерений. Таким образом, вы можете просто использовать:

result = fft(fft(fft(A, [], 1), [], 2), [], 3);
...