Skip to content
Snippets Groups Projects
computeFXYZ.m 1.69 KiB
function output=computeFXYZ(gene_data,varargin)
%Function for antitrasforming a Fourier field to real space
% 
%  INPUTS:
%      gene_data  -> 3D field in Fourier
%      x_local    -> Fourier in x (1st dim.)
%
%    [output]=COMPUTEFXYZ(gene_data)

%%
if nargin==1
    x_local=1;
else
    x_local=varargin{1};
end

if x_local
    [nx,nky,nz]=size(gene_data);
    %extend to whole ky by imposing reality condition
    ny=2*nky-1;
    
    if ny~=1
        %note, we need one extra point which we set to zero for the ifft 
        spectrumKxKyZ=zeros(nx,ny,nz);
        spectrumKxKyZ(:,1:nky,:)=gene_data(:,:,:);
        spectrumKxKyZ(1,(nky+1):(ny),:)=conj(gene_data(1,nky:-1:2,:));
        spectrumKxKyZ(2:nx,(nky+1):(ny),:)=conj(gene_data(nx:-1:2,nky:-1:2,:));
    else
        %pad with zeros to interpolate on fine scale
        ny=20;
        spectrumKxKyZ=zeros(nx,ny,nz);
        spectrumKxKyZ(:,2,:)=gene_data(:,:,:);
    end   
    %inverse fft, symmetric as we are using real data
    spectrumXKyZ=nx*ifft(spectrumKxKyZ,[],1);
    output=ny*ifft(spectrumXKyZ,[],2,'symmetric');
    clear  spectrumKxKyZ 
 
else  
    
    [nx,nky,nz]=size(gene_data);
    %   extend to whole ky by imposingreality condition
    ny=2*nky-1;
    if ny~=1
        spectrumXKyZ=zeros(nx,ny,nz);
        spectrumXKyZ(:,1:nky,:)=gene_data(:,:,:);
        spectrumXKyZ(1,(nky+1):(ny),:)=conj(gene_data(1,nky:-1:2,:));
        spectrumXKyZ(2:nx,(nky+1):(ny),:)=conj(gene_data(2:1:nx,nky:-1:2,:));   
    else
        %pad with zeros to interpolate on fine scale
        ny=50;
        spectrumXKyZ=zeros(nx,ny,nz);
        spectrumXKyZ(:,2,:)=gene_data(:,:,:);

    end
    output=ny*ifft(spectrumXKyZ,[],2,'symmetric');
    clear  spectrumK=XKyZ 
end