Yes. This proof for analytic case is generalized by extending the scales' limits to $-\infty$, which permits the change of variables and splitting of integral.
It can also be observed as follows from $2(c)$:
$$
\begin{align}
f(b) &= \frac{1}{2} \Re e \left\{ \frac{1}{C_\psi} \int_0^\infty \left< f(t), \psi_b(t) \right> \frac{da}{a} \right\} \\
&= \frac{1}{2} \frac{1}{C_\psi} \int_0^\infty \left< f(t), \Re e \{ \psi_{a,b}(t) \} \right> \frac{da}{a}
\end{align}
$$
where $\psi_{a,b}(t) = \psi((t-b)/a)$, and $<f, \psi_{a,b}> = \int_{-\infty}^{\infty} f(t) \psi^{*}((t - b)/a)$. That is, real part of sum of complex CWT is same as sum of CWT with the real-valued wavelet.
Is $f(t)$ allowed to be complex?
- Complex wavelet: must be paired with its anti-analytic complement, as $\hat f(\omega)$ is no longer Hermitian-symmetric.
- Real wavelet: if one integral can reconstruct a real $f(t)$, it can reconstruct an imaginary $f(t)$ - and by linearity of convolution, it can also reconstruct $f(t) = g(t) + ih(t)$. I have validated this for the Morlet wavelet with ssqueezepy.
Requirements for both are: 1) scales span $-\infty$ to $\infty$, and 2) $\hat\psi(\omega)$ is zero-phase (i.e. real-valued). (2 may be optional, am unsure - see below). Note that in general case, $C_\psi$ should be computed by integrating $-\infty$ to $\infty$ rather than relying on Hermitian symmetry.
Update: definitive answer here.
Additional considerations
Texts omit two important points regarding any CWT reconstruction:
- DC: the CWT only captures DC at infinite scale, which in practice means "never". To compensate we require a lowpass filter.
- Filterbank: what's the minimum number of wavelets required for one-integral inverse to recover the input? One, two, infinite? Briefly: the filterbank must tile the entire frequency axis. Details follow.
2 is explained by the Littlewood-Paley sum:
$$
A(\omega) = |\hat \phi(\omega)|^2 + \sum_{\lambda \in \Lambda} |\hat\psi_\lambda(\omega)|^2
$$
where $1 - \alpha \leq A(\omega) \leq 1$ with $\alpha < 1$. This states that the wavelets, along the lowpass filter, tile the entire frequency axis. Further, applying Parseval-Plancherel's theorem, it's a statement on energy conservation:
$$
\text{CWT}(x) = x\star \phi(t) + x \star \psi_\lambda (t) \Rightarrow
$$
$$
(1 - \alpha)||x||^2 \leq ||\text{CWT}(x)||^2 \leq ||x||^2
$$
(where $||\cdot||^2$ is energy, $\sum |\cdot|^2$) The summation with L1-normed analytic Morlet wavelet filterbank + Gaussian lowpass looks like this:
($\leq 1$ is an optional (but desired) criterion; in general we have $a \leq A(\omega) \leq b$)
If $\alpha = 0$, then $||\text{CWT}(x)||^2 = ||x||^2$, i.e. $E_\text{out} = E_\text{in}$, and the filterbank constitutes a tight frame.
Notice, if we remove some of the wavelets, the sum will diminish (potentially to zero), and we deviate from $E_\text{out} = E_\text{in}$, in worst case $E_\text{out}=0$ if input lies entirely in excluded portion. Also notice that fewer wavelets deviate more from a tight frame:
We can imagine that one or two wavelets will have an awful LP-sum - and that more wavelets in general improve the sum. Reconstruction quality can be directly predicted from this summation, as it dictates which frequencies are amplified or attenuated relative to one another.
We can also see the role of zero-phase: if summing zero phase wavelets yields the original signal, then summing wavelets with phase differences will yield the signal with frequencies out of phase. (Granted this logic permits for non-zero phase, as long as relative phases remain same - but this'd be complicated to design)
Plots code
import numpy as np
from kymatio.numpy import Scattering1D
from kymatio.visuals import plot
from scipy.fft import ifftshift
for Q in (8, 1):
ts = Scattering1D(11, 2048, Q=Q, max_pad_factor=None)
N = len(ts.psi1_f[0][0])
lp = np.sum([p[0]**2 for p in ts.psi1_f], axis=0)
lp[1:] += lp[1:][::-1]
lp += ts.phi_f[0]**2
lp = ifftshift(lp)
w = np.linspace(-np.pi, np.pi, N)
title = ("Morlet | analytic + anti-analytic + lowpass | %s wavelets per octave"
% Q)
plot(w, lp, title=title, show=1, ylims=(0, 1.25))
Master branch doesn't include visuals
; install latest via pip install git+https://github.com/kymatio/kymatio.git@refs/pull/674/head