% frameProcessing.m This function adjust length of signal for video analysis

function [ DoA ] = frameProcessing_ambisonics_fd( ambixFormat, blockIndex, stepSize, bufferSize, ...
                                                  grid_dirs, window, energyWinFactor, ...
												  index_o2_lowF, index_o3_lowF, index_o4_lowF, ...
												  index_o5_lowF, index_o6_lowF, index_o7_lowF, ...
												  index_o2_highF, index_o3_highF, index_o4_highF, ...
												  index_o5_highF, index_o6_highF, index_o7_highF, ambixOrder )

    % take a buffer
    ambixFormatChunk    = ambixFormat( (blockIndex-1) * stepSize + 1 : (blockIndex-1) * stepSize + bufferSize, : );

    % apply window and do fft
    ambixFormatChunkFft = fft( ambixFormatChunk .* window, bufferSize, 1 ) / bufferSize;
    ambixFormatChunkFft = 2 .* ambixFormatChunkFft( 1 : bufferSize/2 + 1, : ) * energyWinFactor;
    
    % apply frequency limit for orders > 1
    if ambixOrder == 2
        ambixFormatChunkFft( 1 : index_o2_lowF, 5 : 9 )         = 0;
        ambixFormatChunkFft( index_o2_highF : end, 5 : 9 )      = 0;
    elseif ambixOrder == 3
        ambixFormatChunkFft( 1 : index_o2_lowF, 5 : 9 )         = 0;
        ambixFormatChunkFft( index_o2_highF : end, 5 : 9 )      = 0;
        ambixFormatChunkFft( 1 : index_o3_lowF, 10 : 16 )       = 0;
        ambixFormatChunkFft( index_o3_highF : end, 10 : 16 )    = 0;
    elseif ambixOrder == 4
        ambixFormatChunkFft( 1 : index_o2_lowF, 5 : 9 )         = 0;
        ambixFormatChunkFft( index_o2_highF : end, 5 : 9 )      = 0;
        ambixFormatChunkFft( 1 : index_o3_lowF, 10 : 16 )       = 0;
        ambixFormatChunkFft( index_o3_highF : end, 10 : 16 )    = 0;
        ambixFormatChunkFft( 1 : index_o4_lowF, 17 : 25 )       = 0;
        ambixFormatChunkFft( index_o4_highF : end, 17 : 25 )    = 0;
	elseif ambixOrder == 5
    	ambixFormatChunkFft( 1 : index_o2_lowF, 5 : 9 )         = 0;
    	ambixFormatChunkFft( index_o2_highF : end, 5 : 9 )      = 0;
    	ambixFormatChunkFft( 1 : index_o3_lowF, 10 : 16 )       = 0;
    	ambixFormatChunkFft( index_o3_highF : end, 10 : 16 )    = 0;
    	ambixFormatChunkFft( 1 : index_o4_lowF, 17 : 25 )       = 0;
    	ambixFormatChunkFft( index_o4_highF : end, 17 : 25 )    = 0;
		ambixFormatChunkFft( 1 : index_o5_lowF, 26 : 36 )       = 0;
    	ambixFormatChunkFft( index_o5_highF : end, 26 : 36 )    = 0;
	elseif ambixOrder == 6
    	ambixFormatChunkFft( 1 : index_o2_lowF, 5 : 9 )         = 0;
    	ambixFormatChunkFft( index_o2_highF : end, 5 : 9 )      = 0;
    	ambixFormatChunkFft( 1 : index_o3_lowF, 10 : 16 )       = 0;
    	ambixFormatChunkFft( index_o3_highF : end, 10 : 16 )    = 0;
    	ambixFormatChunkFft( 1 : index_o4_lowF, 17 : 25 )       = 0;
    	ambixFormatChunkFft( index_o4_highF : end, 17 : 25 )    = 0;
		ambixFormatChunkFft( 1 : index_o5_lowF, 26 : 36 )       = 0;
    	ambixFormatChunkFft( index_o5_highF : end, 26 : 36 )    = 0;
		ambixFormatChunkFft( 1 : index_o6_lowF, 37 : 49 )       = 0;
    	ambixFormatChunkFft( index_o6_highF : end, 37 : 49 )    = 0;
	elseif ambixOrder == 7
    	ambixFormatChunkFft( 1 : index_o2_lowF, 5 : 9 )         = 0;
    	ambixFormatChunkFft( index_o2_highF : end, 5 : 9 )      = 0;
    	ambixFormatChunkFft( 1 : index_o3_lowF, 10 : 16 )       = 0;
    	ambixFormatChunkFft( index_o3_highF : end, 10 : 16 )    = 0;
    	ambixFormatChunkFft( 1 : index_o4_lowF, 17 : 25 )       = 0;
    	ambixFormatChunkFft( index_o4_highF : end, 17 : 25 )    = 0;
		ambixFormatChunkFft( 1 : index_o5_lowF, 26 : 36 )       = 0;
    	ambixFormatChunkFft( index_o5_highF : end, 26 : 36 )    = 0;
		ambixFormatChunkFft( 1 : index_o6_lowF, 37 : 49 )       = 0;
    	ambixFormatChunkFft( index_o6_highF : end, 37 : 49 )    = 0;
		ambixFormatChunkFft( 1 : index_o7_lowF, 50 : 64 )       = 0;
    	ambixFormatChunkFft( index_o7_highF : end, 50 : 64 )    = 0;
    end

    % calculate spherical covariance
    sphCov              = cov( ambixFormatChunkFft );
    [ DoA, ~ ]			= sphPWDmap( sphCov, grid_dirs, 0 );
    DoA                 = abs( DoA );
    
end
