Main Content

Construct Perfect Reconstruction Biorthogonal Filter Bank

This example shows how to take an expression of a biorthogonal filter pair and construct lowpass and highpass filters to produce a perfect reconstruction (PR) biorthogonal wavelet filter bank.

The LeGall 5/3 filter is the wavelet used in JPEG2000 for lossless image compression. The lowpass (scaling) filters for the LeGall 5/3 wavelet have five and three nonzero coefficients respectively. The expressions for these two filters are:

H0(z)=1/8(-z2+2z+6+2z-1-z-2)

H1(z)=1/2(z+2+z-1)

Create these filters.

H0 = 1/8*[-1 2 6 2 -1];
H1 = 1/2*[1 2 1];

Many of the discrete wavelet and wavelet packet transforms in Wavelet Toolbox™ rely on the filters being both even-length and equal in length in order to produce the perfect reconstruction filter bank associated with these transforms. These transforms also require a specific normalization of the coefficients in the filters for the algorithms to produce a PR filter bank. Use the biorfilt function on the lowpass prototype functions to produce the PR wavelet filter bank.

[LoD,HiD,LoR,HiR] = biorfilt(H0,H1);

Use the isbiorthwfb function to confirm the four filters jointly satisfy the necessary and sufficient conditions to be a two-channel biorthogonal PR wavelet filter bank.

[tf,checks] = isbiorthwfb(LoR,LoD,HiR,HiD)
tf = logical
   1

checks=7×3 table
                                                       Pass-Fail    Maximum Error    Test Tolerance
                                                       _________    _____________    ______________

    Dual filter lengths correct                          pass                 0                 0  
    Filter sums                                          pass        2.7756e-17        1.4901e-08  
    Zero lag lowpass dual filter cross-correlation       pass        2.2204e-16        1.4901e-08  
    Zero lag highpass dual filter cross-correlation      pass        2.2204e-16        1.4901e-08  
    Even lag lowpass dual filter cross-correlation       pass                 0        1.4901e-08  
    Even lag highpass dual filter cross-correlation      pass                 0        1.4901e-08  
    Even lag lowpass-highpass cross-correlation          pass        1.3878e-17        1.4901e-08  

Now you can use these filters in discrete wavelet and wavelet packet transforms. To demonstrate perfect reconstruction, load and plot an ECG signal.

load wecg
plot(wecg)
axis tight
grid on

Figure contains an axes object. The axes object contains an object of type line.

Obtain the discrete wavelet packet transform of the ECG signal using the LeGall 5/3 filter set.

[wpt,L] = dwpt(wecg,LoD,HiD);

Now use the reconstruction (synthesis) filters to reconstruct the signal and demonstrate perfect reconstruction.

xrec = idwpt(wpt,L,LoR,HiR);
plot([wecg xrec])
axis tight
grid on

Figure contains an axes object. The axes object contains 2 objects of type line.

norm(wecg-xrec,"inf")
ans = 
3.3307e-15

You can also use this filter bank in the 1-D and 2-D discrete wavelet transforms. Read and plot an image.

im = imread('woodsculp256.jpg');
image(im)
axis off

Figure contains an axes object. The hidden axes object contains an object of type image.

Obtain the 2-D wavelet transform using the LeGall 5/3 analysis filters.

[C,S] = wavedec2(im,3,LoD,HiD);

Reconstruct the image using the synthesis filters.

imrec = waverec2(C,S,LoR,HiR);

Demonstrate perfect reconstruction.

norm(double(im)-imrec,"fro")
ans = 
7.2465e-11

The LeGall 5/3 filter is equivalent to the built-in bior2.2 wavelet in the toolbox. Confirm the LeGall 5/3 filters are equal to the filters associated with the bior2.2 wavelet.

[LD,HD,LR,HR] = wfilters("bior2.2");
tiledlayout(2,2)
nexttile
hl = stem([LD' LoD']);
hl(1).MarkerFaceColor = [0 0 1];
hl(1).Marker = "o";
hl(2).MarkerFaceColor = [1 0 0];
hl(2).Marker = "^";
grid on
title("Lowpass Analysis")
nexttile
hl = stem([HD' HiD']);
hl(1).MarkerFaceColor = [0 0 1];
hl(1).Marker = "o";
hl(2).MarkerFaceColor = [1 0 0];
hl(2).Marker = "^";
grid on
title("Highpass Analysis")
nexttile
hl = stem([LR' LoR']);
hl(1).MarkerFaceColor = [0 0 1];
hl(1).Marker = "o";
hl(2).MarkerFaceColor = [1 0 0];
hl(2).Marker = "^";
grid on
title("Lowpass Synthesis")
nexttile
hl = stem([HR' HiR']);
hl(1).MarkerFaceColor = [0 0 1];
hl(1).Marker = "o";
hl(2).MarkerFaceColor = [1 0 0];
hl(2).Marker = "^";
grid on
title("Highpass Synthesis")

Figure contains 4 axes objects. Axes object 1 with title Lowpass Analysis contains 2 objects of type stem. Axes object 2 with title Highpass Analysis contains 2 objects of type stem. Axes object 3 with title Lowpass Synthesis contains 2 objects of type stem. Axes object 4 with title Highpass Synthesis contains 2 objects of type stem.