Summary: A walkthrough of the inverse discrete wavelet transform and the use of the r_idwt program.
Once we arrive at our discrete wavelet coefficients, we need a way to reconstruct them back into the original signal (or a modified original signal if we played around with the coefficients). In order to do this, we utilize the process known as the inverse discrete wavelet transform.
Much like the DWT can be explained by using filter bank theory, so can the reconstruction of the IDWT. The process is simply reversed. The DWT coefficients are first upsampled (the approximation and the detail coefficients are handled separately) by placing zeros in between every coefficient, effectively doubling the lengths of each. These are then convolved with the reconstruction scaling filter for approximation coefficients (the reconstruction scaling filter is simply the original scaling filter that has been flipped left to right) and the reconstruction wavelet filter for the detail coefficients. These results are then added together to arrive at the original signal.
Similar to how we made the signal periodic before doing our DWT calculations on it, we must make our dwt coefficients periodic before convolving to obtain the original signal. This is done by simply taking the first N/2-1 coefficients from the DWT coefficients, and appending them to the end. Remember that N is the length of our scaling filter.
After the convolution and addition, to grab the part of the signal we want away from the convolution ‘junk’, we grab the coefficients from N to the length of the signal + N -1. This will give us our original signal.
NOTE: THIS MAY NOT BE CORRECT. WE BELIEVE THE THEORY IS SOUND BUT WE ARE ARRIVING AT ANOMOLOUS RESULTS AND BELIEVE THE REASON WHY IS DUE TO THIS PERIODIZATION. FURTHER DETAILS WILL BE ADRESSED FURTHER DOWN.
If you are looking for a graphical description of this process, simply look at the figure below:
![]() |
Please keep in mind that the pattern of reconstruction must match the pattern of the DWT’s deconstruction, so in our case for multi level reconstruction we simply reconstruct the approximation coefficients in order from the finest scale to the coarsest scale. In the above figure, the lower paths are the approximation coefficients and the higher paths are the detail coefficients; also the junction of two arrowheads corresponds to an addition.
x = r_idwt(fx,scaling,wavelet,scales,graphs)
The function is called using the r_idwt function name. The parameter fx is the DWT from which we wish to reconstruct the original signal. The parameter scaling is the hrn output given by our R_daub code, or the reconstructive scaling function of another wavelet function. The parameter wavelet is the wavelet coefficients given by the hr1n output of our R_daub code, or the reconstructive wavelet coefficients of any other wavelet function. The parameter scales is the amount of levels wanted in the IDWT. The parameter graphs is 0 for no graphs, 1 for graphs of the IDWT at each level. The output x is reconstructed original signal.
This code uses a loop to handle the possibility of multiple levels as opposed to recursion used in our DWT code. There are two main reasons for this: The first is that the recursion used in the DWT code was used primarily to show the recursive nature of the DWT at multiple levels. As that has been concretely shown there is no real reason to show it again with the IDWT as the idea is still the same.
Also, as explained above we had been running into errors with our reconstruction and tried to recreate an example code as accurately as possible, and the example code utilized a loop as well.
The code segments we believe contain the errors are presented below:
![]() |
The circled code is the code we believe is causing the error with reconstruction, with the shade of the circle noting our belief of which code is responsible (the darker the circle the more strongly we believe it is the erroneous code). Of course, it could potentially be all three pieces, our theoretical model, or something else entirely.
Examples (+Errors)
Let’s go over some examples. We will use our DWT result from our last module (r_dwt).
recon = r_idwt(dwt,hr0,hr1,1,0);
This will reconstruct our DWT coefficients into our original signal. See below for the actual results:
![]() |
This looks fairly accurate! It appears that we have perfectly reconstructed our original signal, as shown below:
![]() |
Oh no! Look at the last couple of coefficients (actually, the last 8…which corresponds to the length of our filters, hrmmmm)…we can see they are off from our original signal now:
![]() |
For an even better example, we’ll look at a different signal:
![]() |
And its reconstruction:
![]() |
There is clearly something erroneous happening somewhere in our iDWT.
The problem is magnified when we do our second level iDWT (to our original noisy sinusoid signal):
![]() |
Now not only is it not as accurate, there are mistakes in the first 8 coefficients as well! This stems from our inaccurate results in our first IDWT (the end effects), and these are all convolution errors.