离散小波变换(DWT)
(DiscreteWaveletTransform, DWT)离散小波变换是一种近似的小波变换方法,将信号分解成不同尺度的近似系数和细节系数。DWT使用离散的小波函数和离散的时间尺度,通过滤波和下采样操作来实现信号的分解。通常,DWT将信号分解为一组高频和低频子信号。
关于dwt,matlab官方文档中,给出了wavedec小波分解函数使用图解,对于信号X,通过小波变换后(带通滤波器)分解为一个高通滤波器和一个低通滤波器串联,进而分解出相对高通系数cD1和近似系数cA1,再将近似系数分解为相对高通系数cD2和近似系数cA2,进一步分解为cD3和cA3,如下图所示,为3层小波分解
离散小波变换的一级分解公式如下:
A
1
(
n
)
=
∑
k
f
(
k
)
∗
h
(
k
−
n
)
D
1
(
n
)
=
∑
k
f
(
k
)
∗
g
(
k
−
n
)
A_1(n)=\sum_k f(k) * h(k-n) \\ D_1(n)=\sum_k f(k) * g(k-n)
A1(n)=k∑f(k)∗h(k−n)D1(n)=k∑f(k)∗g(k−n)
其中:
A
1
(
n
)
A_1(n)
A1(n)是低频( 近 )系数。
D
1
(
n
)
D_1(n)
D1(n)是高频( 细节 )系数。
h
(
k
)
h(k)
h(k)和
g
(
k
)
g(k)
g(k)分别是小波分析滤波器的低通和高通滤波器系数。离散小波变换允许信号在不同尺度上的分解和重构,以便分析不同频率成分。
调用格式如下;
[c,l] = wavedec(signal,n,wavename)
其中c为输出的近似系数和细节系数,l表示了各部分信号的长度,signal为待处理信号,n表示分解层数,wavename为使用的小波函数名称,其中c和l的排列顺序在图中已给出了说明。
该函数采用了离散正交化小波变换分解,所谓正交化即保证每一次分解后的数据长度不变。
示例代码
% 生成信号
Fs = 1000; % 采样频率
t = 0:1/Fs:1-1/Fs; % 时间向量
x = cos(2*pi*50*t) + cos(2*pi*120*t); % 原始信号
% 进行小波变换
wname = 'db4'; % 小波名称
level = 3; % 分解级数
[C,L] = wavedec(x,level,wname); % 小波分解
% 提取近似系数和细节系数
A = cell(1,level);
D = cell(1,level);
for i = 1:level
A{i} = wrcoef('a',C,L,wname,i); % 近似系数
D{i} = wrcoef('d',C,L,wname,i); % 细节系数
end
% 绘制结果
figure;
subplot(level+1,1,1);
plot(t,x);
title('原始信号');
for i = 1:level
subplot(level+1,1,i+1);
plot(t,A{i},t,D{i});
title(['近似系数和细节系数(级别 ' num2str(i) ')']);
legend('近似系数','细节系数')
end
结果图:
另一种使用方法:
% 生成信号
Fs = 1000; % 采样频率
t = 0:1/Fs:1-1/Fs; % 时间向量
x = cos(2*pi*50*t) + cos(2*pi*120*t); % 原始信号
% 进行小波变换
wname = 'db4'; % 小波名称
level = 3; % 分解级数
[C,L] = wavedec(x,level,wname); % 小波分解
plotDetCoefHelpper(x,C,L);%借助绘图帮助函数
function plotDetCoefHelpper(signal,C,L)
m = length(L); %记录近似系数和细节系数的个数,level+1
subplot(m,1,1)
plot(signal); %绘制原始信号
title("original signal")
sum = 0;
for i = 1:m-1
subplot(m,1,i+1)
if i == 1
plot(C(1:L(i)));%绘制近似系数
title('Approximation Coefficients')
else
sum=sum+L(i-1);
plot(C(sum+1:L(i)+sum));%绘制细节系数
title(['Level ' num2str(i-1) ' Detail Coefficients']);
end
end
end
输出结果如下: