FFT of 3D array in MATLAB

I am trying to understand how the FFT of different directions in MATLAB works to reproduce in C/C++ instead.
So far I have the following simple example in MATLAB:
clearvars; clc; close all;
%3D FFT test
Nx = 8;
Ny = 4;
Nz= 6;
Lx =16;
Ly = 6;
dx = Lx/Nx;
dy = Ly/Ny;
%-----------
xi_x = (2*pi)/Lx;
yi_y = (2*pi)/Ly;
xi = ((0:Nx-1)/Nx)*(2*pi);
yi = ((0:Ny-1)/Ny)*(2*pi);
x = xi/xi_x;
y = yi/yi_y;
zlow = 0; %a
zupp =6; %b
Lz = (zupp-zlow);
eta_zgl = 2/Lz;
[D,zgl] = cheb(Nz);
zgl = (1/2)*(((zupp-zlow)*zgl) + (zupp+zlow));
[X,Z,Y] = meshgrid(x,zgl,y); %this gives 3d grid with z-by-x-by-y size (i.e. ZXY)
%ICs
A = 2*pi / Lx;
B = 2*pi / Ly;
u = (Z-zlow) .* (Z-zupp) .* sin(A*X).* sin(B*Y);
uh1 =(fft(u,[],3));%ZXY
uh2 =(fft(u,[],1));%ZXY
uh3 =(fft(u,[],2));%ZXY
So, in C/C++ I have a 3D tensor with (Nz+1) rows and Nx coumns and Ny matrices and taking the 1D FFT along each "row" of u returns the same results as the following in MATLAB:
uh3 =(fft(u,[],2));%ZXY
While taking the 1D FFT of u along each column of u in C/C++ returns the same result as the following in MATLAB:
uh2 =(fft(u,[],1));%ZXY
Then my question is what does this 1D FFT represent? and how should I represent it in C/C++?
uh1 =(fft(u,[],3));%ZXY
The cheb(N) function is:
function [ D, x ] = cheb ( N )
if ( N == 0 )
D = 0.0;
x = 1.0;
return
end
x = cos ( pi * ( 0 : N ) / N )';
c = [ 2.0; ones(N-1,1); 2.0 ] .* (-1.0).^(0:N)';
X = repmat ( x, 1, N + 1 );
dX = X - X';
% Set the off diagonal entries.
D =( c * (1.0 ./ c )' ) ./ ( dX + ( eye ( N + 1 ) ) );
% Diagonal entries.
D = D - diag ( sum ( D' ) );
return
end

 Accepted Answer

Matt J
Matt J on 6 Aug 2024
Why reinvent the wheel. Why not just use the open source FFTW C/C++ library (which Matlab is based on).
In any case, the mathematical interpretation of Matlab's 1D FFT is in the documentation,

9 Comments

I am using the FFTW library in C++ and I have tested Eigen FFT functions as well. FFTW library is not super user-friendly honestly and I have tried to reproduce the FFT MATLAB output to no avail. Thanks.
Matt J
Matt J on 6 Aug 2024
Edited: Matt J on 6 Aug 2024
Is the difference more than just a global scaling factor? We cannot assess the problem without examples.
There's no difference. It is just that I am not sure what "3" here represents in
uh1 =(fft(u,[],3));%ZXY
Like, I get that it supposed to be along "y" direction, but what does that really mean? for a 3D tensor u with nz+1 rows, nx columns and y matrices what does 1D FFT of u along y mean (i.e. 3)?
As the link you posted explains FFT along each columns is (u,[],1) and FFT along each row is (u,[],2) then what is fft(u,[],3)?
Matt J
Matt J on 6 Aug 2024
Edited: Matt J on 6 Aug 2024
Since you understand that fft(u,[],1) and fft(u,[],2) are the same operation (along different dimensions), why do you think there is a different meaning to fft(u,[],3)? There isn't.
Matt J
Matt J on 6 Aug 2024
Edited: Matt J on 6 Aug 2024
It is the same as if you did it in 3 steps:
tmp=shiftdim(u,2);
Tmp=fft(tmp,[],1);
uh3=shiftdim( Tmp , -2);
So, fft(u,[],3) is just 1D fft along each row of u?
Matt J
Matt J on 6 Aug 2024
Edited: Matt J on 7 Aug 2024
No, it is the fft along each vector u(i,j,:).
This line "fft along each u(i,j,:)" actually solves my issue and makes more sense!

Sign in to comment.

More Answers (0)

Asked:

on 6 Aug 2024

Commented:

on 7 Aug 2024

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!