docs: public static void shiftZeroFrequency(InterleavedF32 transform, boolean forward ) {
  
  		int hw = transform.width/2;
  		int hh = transform.height/2;
  
  		if( transform.width%2 == 0 && transform.height%2 == 0 ) {
  			// if both sides are even then a simple transform can be done
  			for( int y = 0; y < hh; y++ ) {
  				for( int x = 0; x < hw; x++ ) {
  					float ra = transform.getBand(x,y,0);
  					float ia = transform.getBand(x,y,1);
  
  					float rb = transform.getBand(x+hw,y+hh,0);
  					float ib = transform.getBand(x+hw,y+hh,1);
  
  					transform.setBand(x,y,0,rb);
  					transform.setBand(x,y,1,ib);
  					transform.setBand(x+hw,y+hh,0,ra);
  					transform.setBand(x+hw,y+hh,1,ia);
  
  					ra = transform.getBand(x+hw,y,0);
  					ia = transform.getBand(x+hw,y,1);
  
  					rb = transform.getBand(x,y+hh,0);
  					ib = transform.getBand(x,y+hh,1);
  
  					transform.setBand(x+hw,y,0,rb);
  					transform.setBand(x+hw,y,1,ib);
  					transform.setBand(x,y+hh,0,ra);
  					transform.setBand(x,y+hh,1,ia);
  				}
  			}
  		} else {
  			// with odd images, the easiest way to do it is by copying the regions
  			int w = transform.width;
  			int h = transform.height;
  
  			int hw1 = hw + w%2;
  			int hh1 = hh + h%2;
  
  			if( forward ) {
  				InterleavedF32 storageTL = new InterleavedF32(hw1,hh1,2);
  				storageTL.setTo(transform.subimage(0, 0, hw1, hh1, null));
  
  				InterleavedF32 storageTR = new InterleavedF32(hw,hh1,2);
  				storageTR.setTo(transform.subimage(hw1, 0, w, hh1, null));
  
  				transform.subimage(0,0,hw,hh, null).setTo(transform.subimage(hw1,hh1,w,h, null));
  				transform.subimage(hw,0,w, hh, null).setTo(transform.subimage(0,hh1,hw1,h, null));
  				transform.subimage(hw,hh,w,h, null).setTo(storageTL);
  				transform.subimage(0,hh,hw,h, null).setTo(storageTR);
  			} else {
  				InterleavedF32 storageBL = new InterleavedF32(hw,hh1,2);
  				storageBL.setTo(transform.subimage(0, hh, hw, h, null));
  
  				InterleavedF32 storageBR = new InterleavedF32(hw1,hh1,2);
  				storageBR.setTo(transform.subimage(hw, hh, w, h, null));
  
  
  				transform.subimage(hw1,hh1,w,h, null).setTo(transform.subimage(0,0,hw,hh, null));
  				transform.subimage(0,hh1,hw1,h, null).setTo(transform.subimage(hw,0,w, hh, null));
  				transform.subimage(hw1,0,w,hh1, null).setTo(storageBL);
  				transform.subimage(0,0,hw1,hh1, null).setTo(storageBR);
  			}
  		}
  	}