I'm using a wavelet transform in Matlab, so I think of it as a black-box. I'll represent it here as $W(x)$. There's a reconstruction function as well, which I'll write as $W^\dagger(y)$. I can decompose my image $x$ into coefficients and then get perfect reconstruction: $x = W^\dagger(W(x))$. I'm using biorthogonal wavelets, but the only key thing (I think) is that they are not orthogonal, so $W$ is not a square matrix.

My question: how can I get $W^T$, i.e. the adjoint of $W$? And I need it with a fast transform, similar to the speed of $W$. I have $W^\dagger$, and I'm pretty sure this is the same as the pseudo-inverse (which is why I write it like that), so $W^\dagger = (W^TW)^{-1} W^T$. But how can I recover $W^T$ from this?

Of course, I can explicitly create a matrix $W$ so that $W\cdot x = W(x)$, and then easily get $W^T$, but I need a fast transform.

I'm using 9/7 biorthogonal wavelets. I'm hoping that there is some kind of dual wavelet such that $W^T_{\scriptsize \text{original wavelets}} = W^\dagger_{\scriptsize \text{dual wavelets}}$.

Anyone know if this is possible?

Also, anyone know if Wavelab has this kind of thing already builtin? I think the adjoint operator is also known as the synthesis operator.

-
I think "computer-algebra" is a slightly more useful tag than "computer", even if it might not be quite accurate. Hope you don't mind. – Yemon Choi Jul 7 '10 at 2:09

I figured it out. There are two parts:

First, even though a bi-orthogonal wavelet transform is "square", in the sense that the wavelets are linearly independent, a practical implementation, such as in MATLAB, will be slightly rectangular (e.g. input is length 1024, output is 1600). It you change to periodic boundary conditions, then it is square in practice, and this makes things quite a bit simpler.

Second, for biorthogonal wavelets, the inverse (same as the pseudo-inverse, since we're square) is given by analysis with dual wavelets. For the transpose, we want analysis by the original wavelets. These original wavelets are the dual of some other wavelet (as I suspected in the original post), and this wavelet is known. In Matlab, if my original wavelet is given by 'bior4.4' (which are 9/3 bi-orthogonal wavelets), the corresponding wavelet, which has this orginal as its dual, is given by 'rbio4.4'. (I think the dual wavelet of the dual wavelet is the original wavelet, but haven't verified for sure). If you look at the filters for 'rbio4.4', the low and high pass are basically the same as for 'bior4.4' except switched, plus some zero padding (which may be tricky, so let matlab do it for you).

And then you just call the inverse for 'rbio4.4' and you get the transpose of 'bior4.4'. Nice! If anyone needs to do this, let me know and I can provide more details.

-
The software allows you to accept your own answer (I think) – Yemon Choi Jul 8 '10 at 20:40