小波变换,小波包变换 matlab程序。 分解与重构信号,提取特征频率。 画频谱图包络谱图。 也可提取特征向量

小波这玩意儿在信号处理里就是个多面手,今天咱们拿MATLAB来折腾点实际的。先搞个仿真信号热热身:3秒时长,采样率1024Hz,弄个10Hz+50Hz的正弦波叠加,再加点高斯噪声提神。代码直接甩:

fs = 1024;
t = 0:1/fs:3-1/fs;
x = sin(2*pi*10*t) + 0.5*sin(2*pi*50*t) + 0.2*randn(size(t));

小波分解用db4小波基最顺手,分解层数别瞎猜,用wmaxlev算靠谱。三层分解的代码直接上:

[c, l] = wavedec(x, 3, 'db4');

c向量里存着近似系数和细节系数,l记录各层系数长度。重构的时候记得各频带分开搞,比如第三层细节D3对应高频部分:

D3 = wrcoef('d', c, l, 'db4', 3);
A3 = wrcoef('a', c, l, 'db4', 3);

小波包更狠,能把高频部分继续切分。建个树玩玩:

wpt = wpdec(x, 4, 'db4');

节点编号规则要搞懂,2^层数-1这种结构。提取节点(4,3)的系数看看:

node = [4,3];
coef = wpcoef(wpt, node);

频谱图别老用FFT,小波系数能量分布更直观。举个画图例子:

figure;
[C,L] = wavedec(x,5,'db4');
approx = appcoef(C,L,'db4');
subplot(2,1,1);
plot(approx);
title('Approx Coefficients');
subplot(2,1,2);
for k=1:5
    det = detcoef(C,L,k);
    plot(det); hold on;
end
title('Detail Coefficients');

包络谱用Hilbert变换抓特征频率,代码可以这么玩:

env = abs(hilbert(D3));
f = (0:length(env)-1)*fs/length(env);
plot(f(1:200), env(1:200));  % 只看前200点
xlabel('Frequency (Hz)');

特征向量提取这块,搞几个实用特征量:

  1. 各层能量占比
  2. 近似系数方差
  3. 细节系数峭度
  4. 小波熵

上代码:

energy_ratio = zeros(1,4);
for i=1:4
    coeff = detcoef(C,L,i);
    energy_ratio(i) = sum(coeff.^2)/sum(x.^2);
end

approx_var = var(appcoef(C,L,'db4'));
kurt = kurtosis(detcoef(C,L,3));
entropy = wentropy(x,'shannon');

实战中注意小波基选择——轴承故障用db10,语音信号用sym8,别照搬参数。有个坑要注意:边界效应会让信号两头抽风,做实时处理得用滑动窗口。碰到非平稳信号,试试自适应小波包分解,虽然MATLAB里得自己写循环实现。

小波变换,小波包变换 matlab程序。 分解与重构信号,提取特征频率。 画频谱图包络谱图。 也可提取特征向量

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐