2D Spectral Analysis
This script shows you how to perform 2D spectral analysis by looking at the spectrum along the radial direction in wavenumber space. This allows you to reduce a dimension and plot the information in a manner similar to the 1D spectra.
Contents
Create the grid
Nx = 512; Ny = 512; Lx = 1e2; Ly = 1e2;
Grid Spacing.
dx=Lx/Nx; dy=Ly/Ny;
Create the x and y axis'.
x=dx*(1:Nx)'; y=dy*(1:Ny)';
Create the grid.
[xx,yy]=meshgrid(x,y);
Wavenumber spacing.
dk = 2*pi/Lx; dl = 2*pi/Ly;
Wavenumber grid.
k = [0:Nx/2 -Nx/2+1:-1]'*dk; l = [0:Ny/2 -Ny/2+1:-1]'*dl; [kk,ll]=meshgrid(k,l); kksh=fftshift(kk); llsh=fftshift(ll); kmag=sqrt(kk.^2+ll.^2); myfilt=exp(-(kmag/3).^2); kmag=sqrt(kk.^2+ll.^2); kmagv=kmag(:);
Create the function
rr=sqrt((xx-0.5*Lx).^2+(yy-0.5*Ly).^2); myf=exp(-(rr/(0.2*Lx)).^2).*sin(2*pi*xx/(0.1*Lx)).*sin(2*pi*yy/(0.05*Ly))+randn(size(xx))*0.0001;
Take the FFT2
We use the 2D FFT fft2. We also use the function "fftshift" to shift the zero-frequency component to the center of the spectrum.
myspec=abs(fft2(myf)); myspecsh=fftshift(myspec); myspecv=myspec(:);
Compute the radial spectrum
We set a number of bins which are shells around the center.
Nbins=80;
mxk=min(max(k),max(l));
dk=mxk/Nbins;
for ii=1:Nbins
The filter for the shell.
myfilt=(kmagv<ii*dk&kmagv>(ii-1)*dk);
The mean over the shell.
myradspec(ii)=sum(myspecv.*myfilt)/sum(myfilt);
end
Plots
The original function.
figure(1) clf pcolor(xx,yy,myf) shading interp,colorbar title('function')
The 2D spectrum.
figure(2) clf pcolor(kksh,llsh,log((myspecsh))) shading interp,colorbar title('2D spectrum')
The radial spectrum. In red is the raw vectorized version of the 2D plot. While in blue is the radially averaged version.
figure(3) clf plot(kmagv,log(myspecv),'r.','Markersize',1) hold on plot((1:Nbins)*dk-0.5*dk,log(myradspec),'bo') title('log of spectrum vs |k| and the radial spectrum')