Table of Contents

NAME

QccWAVLiftingAnalysisInt, QccWAVLiftingSynthesisInt - perform integer-valued lifting analysis/synthesis of a signal

SYNOPSISINT

#include "libQccPack.h"

int QccWAVLiftingAnalysisInt(QccVectorInt signal, int signal_length, int phase, const QccWAVLiftingScheme *lifting_scheme, int boundary);
int QccWAVLiftingSynthesisInt(QccVectorInt signal, int signal_length, int phase, const QccWAVLiftingScheme *lifting_scheme, int boundary);

DESCRIPTION

QccWAVLiftingAnalysisInt() performs one level of an integer-valued wavelet decomposition, which maps integer signal values into integer-valued wavelet coefficients (see "INTEGER-TO-INTEGER WAVELET TRANSFORMS" below). Specifically, lifting analysis is employed to produce a lowpass subband and a highpass subband of signal. The lowpass subband is returned as the first half of signal; the highpass subband is returned as the last half of signal. signal_length gives the length of signal and may be even or odd.

If phase is QCCWAVWAVELET_PHASE_EVEN, then signal is assumed to start with a even-indexed sample. Otherwise, if phase is QCCWAVWAVELET_PHASE_ODD, it indicates that signal starts with an odd-indexed sample. phase is passed to QccWAVWaveletLWTInt(3) , the lazy wavelet transform, the first step of lifting analysis, to indicate the signal origin.

In the case that signal_length is even, both the odd and even subbands of produced by lifting analysis are the same length. On the other hand, if signal_length is odd, one of the two subbands will be one sample longer than the other. Which subband will be longer will depend on the value of phase. Specifically, if phase is QCCWAVWAVELET_PHASE_EVEN, then the lowpass subband is one sample longer than the highpass subband. If phase is QCCWAVWAVELET_PHASE_ODD, the the highpass subband is one sample longer than the lowpass subband.

lifting_scheme gives the particular lifting scheme to employ, which must be an integer-valued lifting scheme. Lifting implementations of wavelet analysis and synthesis are "hard-coded" into the QccPack library for purposes of execution speed and ease of implementation. As a consequence, only a limited number of wavelets are current supported, and this list cannot be extended by the user (without modifying the QccPack source code, or course). The currently supported integer-valued lifting schemes and their corresponding LFT files (see QccWAVLiftingScheme(3) ) are

LWT.int.lft - integer-valued Lazy Wavelet transform
CohenDaubechiesFeauveau.9-7.int.lft - integer-valued 9/7 biorthogonal wavelet
CohenDaubechiesFeauveau.5-3.int.lft - integer-valued 5/3 biorthogonal wavelet

QccWAVLiftingSynthesisInt() performs one level of wavelet synthesis. The first half of signal is assumed to contain the lowpass subband while the second half contains the highpass subband. Lifting synthesis is performed to produce the output signal which is returned in signal, including a call to QccWAVWaveletInverseLWTInt(3) to perform an inverse lazy wavelet transform. As with QccWAVLiftingAnalysisInt(), signal_length may be even or odd. phase indicates whether the output signal is to start with an even- or odd-indexed sample.

boundary indicates how lifting should be handled at the ends of the signal and can be one of the following: QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION (symmetric extension, valid only for biorthogonal wavelets), or QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION (periodic extension, valid for orthogonal and biorthogonal wavelets). Check the comments at the start of each LFT file for permitted values for boundary for particular lifting schemes. Note that, if periodic extension is used, signal_length must be even (this is due to mathematical constraints).

The case in which signal_length is equal to 1 is degenerate. A wavelet transform is technically not well defined for this situation because it is not clear how to subsample the signal. For integer-valued lifting in QccPack, the length-one signal is merely placed in the lowpass subband unchanged (in which case the highpass subband has zero length) for phase equal to QCCWAVWAVELET_PHASE_EVEN, or placed in the highpass subband unchanged (in which case the lowpass subband has zero length) for phase equal to QCCWAVWAVELET_PHASE_ODD.

Note: In general, you will probably want to use QccWAVWaveletDWT1DInt(3) and QccWAVWaveletInverseDWT1DInt(3) instead of these routines for implementing a discrete wavelet transform and its inverse since QccWAVWaveletDWT1DInt(3) and QccWAVWaveletInverseDWT1DInt(3) allow any number of scales, or levels, of decomposition to be performed.

INTEGER-TO-INTEGER WAVELET TRANSFORMS

Transforms generally provide perfect reconstruction in that the inverse transform will perfectly invert transform coefficients into an exact representation of the original signal. However, when implemented in floating-point arithmetic, the potential for loss arises due to the limits of finite precision in both the forward and inverse transforms. On the other hand, transforms that map integer-valued signals into integer-valued transforms coefficients can guarantee perfect reconstruction, provided an inverse transform can be found. For this reason, lifting schemes, in which inverse transforms are trivial, are favored for the implementation of integer-valued wavelet transforms. Typically, the general approach proposed by Calderbank et al. is followed wherein rounding of floating-point values to integers is performed at each prediction and update step in a lifting scheme. Integer versions of several popular biorthogonal wavelets were created in this manner by Calderbank et al., as well as by Xiong et al.

In traditional floating-point lifting, the prediction and update steps are generally followed by a single application of scaling by a constant in order to produce the usual unitary normalization. This scaling step is somewhat problematic for integer-valued lifting since the scaling constant is usually not an integer. In applications wherein unitary scaling is not required (e.g., in some applications that process each subband completely independently), the scaling step is simply dropped in order to implement an integer-valued version of the transform. Alternatively, one can append three additional lifting steps to implement the scaling; these additional lifting steps can then be rendered integer-valued via appropriate rounding (e.g., Xiong et al.) making the transforms approximately normalized. This latter approach of scaling via additional lifting steps is employed in the integer-valued lifting schemes implemented in QccPack.

RETURN VALUES

These routines return 0 on success and 1 on error.

SEE ALSO

QccWAVLiftingScheme(3) , QccWAVWavelet(3) , QccWAVWaveletDWT1DInt(3) , QccWAVWaveletInverseDWT1DInt(3) , QccPackWAV(3) , QccPack(3)

A. R. Calderbank, I. Daubechies, W. Sweldens, B.-L. Yeo, "Lossless Image Compression Using Integer to Integer Wavelet Transforms", in Proceedings of the International Conference on Image Processing, Lausanne, Switzerland, pp. 596-599, September 1997.

Z. Xiong, X. Wu, S. Cheng, J. Hua, "Lossy-to-Lossless Compression of Medical Volumetric Data Using Three-Dimensional Integer Wavelet Transforms," IEEE Transactions on Medical Imaging, vol. 22, pp. 459-470, March 2003.

I. Daubechies and W. Sweldens, "Factoring Wavelet Transforms Into Lifting Steps," J. Fourier Anal. Appl., vol. 4, no. 3, pp. 245-267, 1998.

AUTHOR

Copyright (C) 1997-2021 James E. Fowler


Table of Contents



Get QccPack at SourceForge.net. Fast, secure and Free Open Source software downloads