kais
kais

Reputation: 33

Decomposition of 3D FFT using 1D FFT in dimension z

I have a 3D matrix:

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

I want to apply a 3D FFT in this matrix using decomposition of 1D FFT. I read that it I should apply 1D FFT in each dimension.

How can I do this?

For x and y, I do this:

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

For the dimension z, I don't know how to do this.

Upvotes: 1

Views: 451

Answers (2)

Cris Luengo
Cris Luengo

Reputation: 60554

First, your loops should look like this:

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

Second, the loop above is identical to (as @Luis Mendo said in his answer):

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

There is no need to write a loop at all.

Third, to compute the 1D FFT along the 3rd dimension, you use:

fft(A,[],3);

You could write this as a loop (just to answer your explicit question, I don't recommend you do this):

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

If, for some reason, that doesn't work in your version of MATLAB because of the shape of y, you can reshape y to be a column vector:

... fft(y(:));

Finally, to compute the 3D FFT using 1D decompositions, you can simply write

A = fftn(A);

This follows the exact same process you are trying to implement, except it does it much faster.

Upvotes: 0

Luis Mendo
Luis Mendo

Reputation: 112689

The fft function accepts a third input specifiying dimension, and is vectorized with respect to the other dimensions. So you can simply use:

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

Upvotes: 1

Related Questions