Continuous Wavelet Transform and Inverse Continuous Wavelet Transform
This example shows how to use the continuous wavelet transform (CWT) and inverse CWT.
CWT of Sine Waves and Impulses
Create and plot a signal consisting of two disjoint sine waves with frequencies of 100 and 50 Hz punctuated by two impulses. The sampling frequency is 1 kHz and the total signal duration is one second. The 100-Hz sine wave occurs over the first 250 milliseconds of the data. The 50-Hz sinusoid occurs over the last 500 milliseconds. The impulses occur at 650 and 750 milliseconds. The signal also has additive white Gaussian noise. The impulse at 650 milliseconds is visible, but the impulse at 750 milliseconds is not clearly evident in the time-domain data.
Fs = 1000; t = 0:1/Fs:1-1/Fs; x = zeros(size(t)); x([625,750]) = 2.5; x = x+ cos(2*pi*100*t).*(t<0.25)+cos(2*pi*50*t).*(t>=0.5)+... 0.1*randn(size(t)); plot(t.*1000,x) grid on; xlabel('msec'); ylabel('Amplitude');
Obtain and plot the CWT using the default analytic Morse wavelet.
[cfs,f] = cwt(x,1000); contour(t.*1000,f,abs(cfs)); xlabel('msec'); ylabel('Hz'); grid on;
The CWT moduli correctly show the supports of the disjoint sinusoids and the locations of the impulses at 650 and 750 milliseconds. In the CWT moduli, the impulse at 750 milliseconds is clearly visible. This is especially true if you plot just the finest-scale wavelet coefficients.
plot(t.*1000,abs(cfs(1,:))) grid on title('Fine-Scale Wavelet Coefficient Moduli') xlabel('msec')
Frequency-Localized Inverse CWT
Using the inverse CWT you can construct frequency-localized approximations to events in your time series. Use the inverse CWT to obtain an approximation to the 100-Hz sinusoid in the previous example.
xrec = icwt(cfs,[],f,[90 110]); plot(t,x); hold on; plot(t,xrec,'r'); legend('Original Signal','Inverse CWT Approximation',... 'Location','NorthEast'); grid on;
If you zoom in on the plot, you see the 100-Hz component is well approximated but the 50-Hz component has been removed.