docs: public void complexForward(final float[] a) {
  		// handle special case
  		if( rows == 1 || columns == 1 ) {
  			if( rows > 1 )
  				fftRows.complexForward(a);
  			else
  				fftColumns.complexForward(a);
  			return;
  		}
  
  		if (isPowerOfTwo) {
  			int oldn2 = columns;
  			columns = 2 * columns;
  			for (int r = 0; r < rows; r++) {
  				fftColumns.complexForward(a, r * columns);
  			}
  			cdft2d_sub(-1, a, true);
  			columns = oldn2;
  		} else {
  			final int rowStride = 2 * columns;
  
  			for (int r = 0; r < rows; r++) {
  				fftColumns.complexForward(a, r * rowStride);
  			}
  
  			for (int c = 0; c < columns; c++) {
  				int idx0 = 2 * c;
  				for (int r = 0; r < rows; r++) {
  					int idx1 = 2 * r;
  					int idx2 = r * rowStride + idx0;
  					temp[idx1] = a[idx2];
  					temp[idx1 + 1] = a[idx2 + 1];
  				}
  				fftRows.complexForward(temp);
  				for (int r = 0; r < rows; r++) {
  					int idx1 = 2 * r;
  					int idx2 = r * rowStride + idx0;
  					a[idx2] = temp[idx1];
  					a[idx2 + 1] = temp[idx1 + 1];
  				}
  			}
  		}
  	}