code: public static void transform1(WaveletDescription<WlCoef_F32> desc ,
  								  GrayF32 input , GrayF32 output ,
  								  GrayF32 storage )
  	{
  		UtilWavelet.checkShape(input,output);
  
  		WlCoef_F32 coef = desc.getForward();
  
  		if( output.width < coef.scaling.length || output.width < coef.wavelet.length )
  			throw new IllegalArgumentException("Wavelet is too large for provided image.");
  		if( output.height < coef.scaling.length || output.height < coef.wavelet.length )
  			throw new IllegalArgumentException("Wavelet is too large for provided image.");
  		storage = InputSanityCheck.checkDeclare(output, storage);
  
  		// the faster routines can only be run on images which are not too small
  		int minSize = Math.max(coef.getScalingLength(),coef.getWaveletLength())*3;
  
  		if( input.getWidth() <= minSize || input.getHeight() <= minSize ) {
  			ImplWaveletTransformNaive.horizontal(desc.getBorder(),coef,input,storage);
  			ImplWaveletTransformNaive.vertical(desc.getBorder(),coef,storage,output);
  		} else {
  			ImplWaveletTransformInner.horizontal(coef,input,storage);
  			ImplWaveletTransformBorder.horizontal(desc.getBorder(),coef,input,storage);
  			ImplWaveletTransformInner.vertical(coef,storage,output);
  			ImplWaveletTransformBorder.vertical(desc.getBorder(),coef,storage,output);
  		}
  	}
docs: <p>
  Performs a single level wavelet transform.
  </p>
  
  @param desc Description of the wavelet.
  @param input Input image. Not modified.
  @param output Where the wavelet transform is written to. Modified.
  @param storage Optional storage image.  Should be the same size as output image. If null then
  an image is declared internally.