cwt of continuous wavelet transform for matlab time-frequency analysis

cwt of continuous wavelet transform for matlab time-frequency analysis

1 Introduction to Wavelet Analysis

Compared with the Fourier transform ratio, both the wavelet transform and the short-time Fourier transform have the same advantages, that is, the signal can be observed in both time and frequency domains.Therefore, the analysis of unsteady signals based on wavelet transform is very useful.

For articles on short-time Fourier transforms, see the following:
Short-time Fourier transform spectrogram for matlab time-frequency analysis
https://blog.csdn.net/weixin_42943114/article/details/88735799

Compared with short-time Fourier transform, wavelet transform has the characteristics of window adaptive, that is, high resolution (but poor frequency resolution) of high frequency signal and high resolution (but poor time resolution) of low frequency signal. In engineering, it is often concerned about low frequency and high frequency occurrence time, so it has been widely used in recent years.

Mathematically, wavelet has the advantage of orthogonalization and is widely used.
However, this article only discusses how to use matlab to implement time-frequency analysis of cwt

2 Basic Principles of Wavelet Analysis

The meaning of wavelet is that it decays fast in time and is shorter than Fourier's sinusoidal wave.
A typical morlet wavelet is shown below:

matlab has many own wavelet functions, which can be viewed by wavemngr('read', 1) and related information by waveinfo.

In time domain, the wavelet coefficients can be obtained by comparing the window signals at different locations one by one through the movement of the wavelet in time. The larger the wavelet coefficients, the better the fit between the wavelet and the signal at that segment.The convolution of the wavelet function with the window signal is used in the calculation as the wavelet coefficients under the window.The length of the window is the same as that of the wavelet.

In the frequency domain, the wavelet coefficients at different frequencies are achieved by stretching or compressing the length of the wavelet to change the length and frequency of the wavelet.Correspondingly, the window length will also change with the length of the wavelet.Because the wavelet is compressed at high frequencies, the time window becomes narrower and the time resolution is higher.

By combining the wavelet coefficients at different frequencies, the time-frequency transformation wavelet coefficients map is obtained.

As you can see from the graph, the frequency resolution at low frequencies is better than at high frequencies.Wavelet time-frequency maps are characterized by overall high and thin at high frequencies and short and wide at low frequencies.

In wavelet, the frequency f of a wavelet is generally measured by a scale scale, and the conversion relationship between the two is:
scale∗f=Fs∗wcf scale * f=Fs * wcf scale∗f=Fs∗wcf
In the formula, Fs represents the sampling frequency of the signal, wcf is the center frequency of the wavelet transform (wave central freq), which can be queried by centfrq(wavename) in matlab.

matlab implementation of 3 cwt

matlab comes with two implementations, one is the function cwt launched in the 2006 version and the other is the function cwt launched in the 2016 version.The two functions have the same name and different usage.
(I don't know why this is the case either.)--|)

Since the names are the same, in use, you can only distinguish between input and output formats if you want to call different versions.

The old version of cwt was used as:

coefs = cwt(x,scales,'wname')

The new version of cwt uses:

[wt,f] = cwt(x,wname,fs)

The most obvious difference is that the new version removes the ability to customize scale functions.The new version also updates and replaces some of the wavelet functions.The old version supports wavelets like'haar','db','sym','cmor','mexh','gaus','bior', and the new version supports'morse','amor'and'bump' wavelets.

The new version of the wavelet function uses the following:

% Define signal information
fs=2^6;    %sampling frequency
dt=1/fs;    %Time accuracy
timestart=-8;
timeend=8;
t=(0:(timeend-timestart)/dt-1)*dt+timestart;
L=length(t);

z=4*sin(2*pi*linspace(6,12,L).*t);

%matlab In-band Wavelet Transform
%new version
figure(1)
[wt,f,coi] = cwt(z,'amor',fs);
pcolor(t,f,abs(wt));shading interp

The old version of the wavelet function uses the following:
cmor wavelet and frequency scaling are used here.

% Define signal information
fs=2^6;    %sampling frequency
dt=1/fs;    %Time accuracy
timestart=-8;
timeend=8;
t=(0:(timeend-timestart)/dt-1)*dt+timestart;
L=length(t);

z=4*sin(2*pi*linspace(6,12,L).*t);
%Old Version
wavename='cmor1-3'; %Variable parameters, respectively cmor Of
%An example of frequency scaling
fmin=2;
fmax=20;
df=0.1;

f=fmin:df:fmax-df;%Expected frequency
wcf=centfrq(wavename); %Center Frequency of Wavelet
scal=fs*wcf./f;%Using frequency conversion scales
coefs = cwt(z,scal,wavename);
figure(2)
pcolor(t,f,abs(coefs));shading interp

For the selection of cmor wavelet Fc and Fb, it can be assumed that the final result only depends on the product size of Fc*Fb.In practical application, the specific value needs to be selected according to the final effect.

The coefs wavelet coefficients obtained by cmor wavelet transform are a complex matrix, the absolute value abs() represents the amplitude of the signal, and the angle() represents the phase of the signal.Generally, the real part of the wavelet coefficients, real(), is used to represent both positive and negative changes in the signal.

In fact, the principle of cwt is very simple, that is, to deconvolute each window with different scales of wavelets and get the matrix of wavelet coefficients.So according to the principle, the wavelet transform can be programmed by itself.

The cwt functions you have programmed are as follows, where the main algorithms are referenced in the official matlab documentation.Here I still use the cmor wavelet as an example. The morlet function formula can be queried or called with the cmorwavf() function:

fs=2^6;    %sampling frequency
dt=1/fs;    %Time accuracy
timestart=-8;
timeend=8;
t=(0:(timeend-timestart)/dt-1)*dt+timestart;
L=length(t);
z=4*sin(2*pi*linspace(6,12,L).*t);

%Define calculation range and precision
fmin=2;
fmax=20;
df=0.1;
totalscal=(fmax-fmin)/df;
f=fmin:df:fmax-df;%Expected frequency
wcf=centfrq(wavename); %Center Frequency of Wavelet
scal=fs*wcf./f;

%Self-implemented Wavelet Functions
coefs2=cwt_cmor(z,1,3,f,fs);
figure(3)
pcolor(t,f,abs(coefs2));shading interp


%Following is the function
function coefs=cwt_cmor(z,Fb,Fc,f,fs)
%1 Preparation of Normalized Signal for Wavelet
z=z(:)';%Force to become y Vector, avoid previous errors
L=length(z);
%2 Calculating scale
scal=fs*Fc./f;

%3 Computational Wavelet
shuaijian=0.001;%Take Wavelet Decay Length of 1%
tlow2low=sqrt(Fb*log(1/shuaijian));%unilateral cmor Decay to 1%Time duration, scream cmor Expression

%3 Integral function of wavelet
iter=10;%Interval Partition Precision of Wavelet Functions
xWAV=linspace(-tlow2low,tlow2low,2^iter);
stepWAV = xWAV(2)-xWAV(1);
val_WAV=cumsum(cmorwavf(-tlow2low,tlow2low,2^iter,Fb,Fc))*stepWAV;
%Pre-convolution preparation
xWAV = xWAV-xWAV(1);
xMaxWAV = xWAV(end);
coefs     = zeros(length(scal),L);%Preset coefs

%4 Convolution of Wavelet and Signal
for k = 1:length(scal)    %One scal A line
    a_SIG = scal(k); %a Is the scale function of this line

    j = 1+floor((0:a_SIG*xMaxWAV)/(a_SIG*stepWAV));
        %j The maximum value is determined, and the larger the scale, the closer the division.Equivalent to stretching a small wave longer.
    if length(j)==1 , j = [1 1]; end
    
    waveinscal = fliplr(val_WAV(j));%Extend the integral value to j Interval, then invert left and right. f Integral Wavelet Function for Current Scale
    
    %5 The most important step wkeep1 take diff(wconv1(ySIG,f))The mile length is lenSIG Middle Section
    %conv(ySIG,f)Convolution.
    coefs(k,:) = -sqrt(a_SIG)*wkeep1(diff(conv2(z,waveinscal, 'full')),L);
    %
end
end

The output is as follows, and you can see that the result is basically the same as that obtained by the function that comes with matlab.

Edge Effect and Impact Cone of 4 cwt

With its own cwt function, the influence cone can be easily drawn.

cwt(z)


Because the wavelet coefficients are convoluted by window functions and wavelets in the wavelet computation, when the window is on the edge of the signal, there will be some no signal in the window.At this point, matlab zeroes this incomplete part of the window, making it long enough.

At this time, because the signal is compelled to zero at the edge, the signal will be distorted, which is represented in the time-frequency diagram as a wider frequency and lower signal strength.When severe, even the whole low frequency part will be distorted.This is the edge effect of cwt.

In order to determine the influence of edge effect, an influence curve is drawn. The signal inside the curve has little or no influence, while the signal outside the curve has greater influence.The curve is like a cone, with the high frequencies near the sides and the low frequencies near the middle, so it is also called the influence cone.

So according to the principle of edge effect, it is known that the small influence range at high frequencies is because the wavelet is compressed at high frequencies, so the window is narrower.Wavelets are stretched at low frequencies, so they correspond to wider windows.The length of the window is the same as that of the wavelet.

There are many ways to evaluate the impact range. For convenience, I draw the impact cone directly using the half-length of the wavelet as the impact range.Specific ideas are as follows, I think that more than half the length of the wavelet is distorted, and then calculate the wavelet length of each point by frequency, and then draw the lines on the graph.

The code is as follows, still taking the cmor wavelet as an example, in order to reflect the phase effect, real() is used here:

%Wavelet Transform Display
clear
fs=2^6;    %sampling frequency
dt=1/fs;    %Time accuracy
timestart=-8;
timeend=8;
t=(0:(timeend-timestart)/dt-1)*dt+timestart;
L=length(t);

z=sin(2*pi*5.*t)+sin(2*pi*9.*t)+sin(2*pi*15.*t);

%Define Scope
wavename='cmor1-3'; %Variable parameters
fmin=2;
fmax=20;
df=0.1;
totalscal=(fmax-fmin)/df;
f=fmin:df:fmax-df;%Expected frequency
wcf=centfrq(wavename); %Center Frequency of Wavelet
scal=fs*wcf./f;

%Old Version
coefs = cwt(z,scal,wavename);
figure(2)
pcolor(t,f,real(coefs));shading interp

tlow2low=sqrt(1*log(1/0.001));%unilateral cmor Decay to 1%Time length of hour
tcoi41=tlow2low*scal;%Wavelet Half Length
bur=(tcoi41<L/2);
fcoi4=f(bur);
tcoi41=tcoi41(bur);
tcoi42=-tcoi41+L;
hold on
plot(tcoi41/fs+timestart,fcoi4,'r','LineWidth',2)
plot(tcoi42/fs+timestart,fcoi4,'r','LineWidth',2)
hold off

Reconfiguration of 5 cwt-icwt

If the default wavelet of the new version of matlab is used, the icwt of the wavelet coefficients after cwt can be used directly.

load mtlb;
wt = cwt(mtlb);
xrec = icwt(wt);

For morlet wavelets, the reconstruction can be achieved by direct sum(real(coefs),1).However, it is best to use the default scale here, otherwise duplicate overlays will cause problems with the amplitude.

See the help documentation for specific usage.

6 wsst to increase cwt resolution

wsst can significantly improve the frequency resolution of cwt.The specific usage is as follows:

clear
fs=2^6;    %sampling frequency
dt=1/fs;    %Time accuracy
timestart=-8;
timeend=8;
t=(0:(timeend-timestart)/dt-1)*dt+timestart;
L=length(t);
z=4*sin(2*pi*linspace(6,12,L).*t);

[sst,f] = wsst(z,fs);
figure(4)
pcolor(t,f,abs(sst));shading interp

The comparison with normal cwt is as follows:

The left is the time-frequency diagram of cwt, and the right is the time-frequency diagram of wsst.
wsst can also be refactored using iwsst, which can be found in iwsst's help documentation.

If you want to improve the accuracy of wsst, you can select wsst in matlab, then Ctrl+D enters the code interface of wsst, and force the na parameter inside to be larger.

This is done by adding a na=512 after the code below (not necessarily 512 here, but by zooming in appropriately based on the actual value of na, in my example here, na=288).Backup is recommended if you are afraid of errors.

na = noct*params.nv;
na=512

The advantage of this is that the decomposition accuracy is significantly improved without affecting the results of iwsst.

Keywords: MATLAB Windows

Added by kingconnections on Sun, 12 May 2019 12:13:00 +0300