小波变换,小波包变换 matlab程序。 分解与重构信号,提取特征频率。 画频谱图包络谱图
·
小波变换,小波包变换 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)');
特征向量提取这块,搞几个实用特征量:
- 各层能量占比
- 近似系数方差
- 细节系数峭度
- 小波熵
上代码:
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程序。 分解与重构信号,提取特征频率。 画频谱图包络谱图。 也可提取特征向量


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


所有评论(0)