MATLAB下小波变换原理实验教程与示例代码

MATLAB下小波变换原理实验教程与示例代码

一、小波变换基础概念

小波变换是一种多尺度时频分析工具,通过“缩放”(尺度参数)和“平移”(位置参数)母小波(Mother Wavelet),将信号分解为不同频率成分的叠加。与傅里叶变换相比,小波变换同时保留时域和频域信息,更适合分析非平稳信号(如突变、瞬态信号)。

核心术语:

二、MATLAB小波工具箱核心函数

MATLAB的Wavelet Toolbox提供了丰富的小波变换函数,以下是最常用的核心函数:

函数名 功能说明
wavedec 一维信号多层小波分解(返回系数向量C和长度向量L
waverec 一维信号小波重构(从系数C和长度L恢复原信号)
dwt 一维信号单层小波分解(返回近似系数cA和细节系数cD
idwt 一维信号单层小波重构(从cAcD恢复原信号)
detcoef 提取多层分解的细节系数(如cD1cD2
appcoef 提取多层分解的近似系数(如cA3
wdenoise 自动小波去噪(推荐用于一维信号,支持自定义小波基和分解层数)
cwt 连续小波变换(返回时频矩阵,用于时频分析)

三、实验1:一维信号小波分解与重构

实验目的:掌握小波分解与重构的基本流程,理解近似系数(低频)和细节系数(高频)的含义。

实验数据:使用MATLAB内置的noisdopp信号(含噪声的 doppler 信号)。

实验步骤与代码

  1. 加载数据

    load noisdopp;  % 加载含噪声的 doppler 信号
    s = noisdopp;   % 信号变量
    l_s = length(s);% 信号长度
    
  2. 单层小波分解(db1小波)

    使用dwt函数将信号分解为近似系数(cA1,低频趋势)细节系数(cD1,高频噪声/突变)

    [cA1, cD1] = dwt(s, 'db1');  % db1小波(Haar小波),单层分解
    
  3. 单层重构

    使用idwt函数从cA1cD1恢复原信号,验证重构精度:

    A1 = idwt(cA1, [], 'db1', l_s);  % 仅用近似系数重构(低频趋势)
    D1 = idwt([], cD1, 'db1', l_s);  % 仅用细节系数重构(高频噪声)
    A0 = idwt(cA1, cD1, 'db1', l_s); % 完整重构(原信号)
    err = max(abs(s - A0));          % 重构误差(应极小,约1e-13)
    
  4. 多层小波分解(3层,db1小波)

    使用wavedec函数进行3层分解,得到近似系数(cA3)3层细节系数(cD1、cD2、cD3)

    [C, L] = wavedec(s, 3, 'db1');  % 3层分解,C为系数向量,L为各层长度
    cA3 = appcoef(C, L, 'db1', 3);  % 提取3层近似系数(最低频趋势)
    [cD1, cD2, cD3] = detcoef(C, L, [1,2,3]);  % 提取1-3层细节系数
    
  5. 多层重构

    使用waverec函数从系数CL恢复原信号,验证重构精度:

    A0 = waverec(C, L, 'db1');  % 完整重构
    err = max(abs(s - A0));     % 重构误差(约1e-13)
    

实验结果

四、实验2:小波去噪应用

实验目的:掌握小波去噪的基本流程,理解阈值处理对去噪效果的影响。

实验数据:使用noisdopp信号(含噪声)。

实验步骤与代码

  1. 小波分解

    使用wavedec函数对信号进行3层分解(db1小波):

    [C, L] = wavedec(s, 3, 'db1');  % 3层分解
    
  2. 阈值处理

    对细节系数(cD1cD2cD3)进行软阈值处理(将小于阈值的系数置0,大于阈值的系数收缩),去除噪声:

    thr = wthrmngr('dw1ddenoLVL','penalhi',C,L,'db1');  % 自动计算阈值(Birgé-Massart策略)
    C_thr = wthresh(C, 's', thr);  % 软阈值处理('s'表示软阈值)
    
  3. 信号重构

    使用waverec函数从阈值处理后的系数C_thr恢复原信号:

    s_denoised = waverec(C_thr, L, 'db1');  % 去噪后信号
    
  4. 效果评估

    绘制原始信号、含噪声信号和去噪后信号的对比图,计算信噪比(SNR)均方误差(MSE)

    % 绘制对比图
    figure;
    subplot(3,1,1); plot(s); title('原始信号');
    subplot(3,1,2); plot(s_noisy); title('含噪声信号');  % s_noisy为含噪声的信号(可替换为s)
    subplot(3,1,3); plot(s_denoised); title('去噪后信号');
    
    % 计算SNR和MSE
    SNR = 10*log10(var(s)/mean((s - s_denoised).^2));  % 信噪比(越大越好)
    MSE = mean((s - s_denoised).^2);                  % 均方误差(越小越好)
    disp(['SNR: ', num2str(SNR), ' dB']);
    disp(['MSE: ', num2str(MSE)]);
    

实验结果

五、实验3:连续小波变换(CWT)时频分析

实验目的:掌握连续小波变换的时频分析能力,理解尺度与频率的关系。

实验数据:使用cwt函数生成频率随时间变化的 chirp 信号(频率从10Hz增加到100Hz)。

实验步骤与代码

  1. 生成 chirp 信号

    fs = 1000;          % 采样频率
    t = 0:1/fs:1;       % 时间向量(1秒)
    f0 = 10;            % 初始频率
    f1 = 100;           % 终止频率
    s = chirp(t, f0, 1, f1);  % 生成 chirp 信号(频率随时间增加)
    
  2. 连续小波变换(CWT)

    使用cwt函数对 chirp 信号进行连续小波变换,选择复Morlet小波'cmor'):

    scales = 1:128;                          % 尺度范围(对应频率从低到高)
    [cwt_coeffs, freq] = cwt(s, scales, 'cmor', fs);  % CWT变换,返回系数和频率
    
  3. 时频图绘制

    绘制时频图(时间×频率×系数幅值),展示 chirp 信号的频率随时间变化:

    figure;
    imagesc(t, freq, abs(cwt_coeffs));  % 时频图(颜色表示系数幅值)
    set(gca, 'YDir', 'normal');         % 频率轴正向朝上
    xlabel('时间 (s)');
    ylabel('频率 (Hz)');
    title('Chirp信号的连续小波时频图');
    colorbar;                           % 显示颜色条
    

实验结果

六、实验4:二维图像小波变换(边缘检测)

实验目的:掌握二维小波变换的图像处理应用,理解小波系数的方向特性(水平、垂直、对角)。

实验数据:使用MATLAB内置的cameraman图像(灰度图像)。

实验步骤与代码

  1. 加载图像

    img = imread('cameraman.tif');  % 加载灰度图像
    img = im2double(img);           % 转换为 double 类型(0-1)
    
  2. 二维小波分解(单层,db1小波)

    使用dwt2函数对图像进行单层分解,得到近似系数(LL,低频,图像轮廓)细节系数(LH:水平,HL:垂直,HH:对角,高频,边缘/纹理)

    [LL, LH, HL, HH] = dwt2(img, 'db1');  % 单层二维分解
    
  3. 边缘检测

    细节系数(LH、HL、HH)反映了图像的边缘信息(高频成分),取绝对值后进行阈值处理,提取边缘:

    edge_LH = abs(LH) > 0.1;  % 水平边缘(阈值0.1)
    edge_HL = abs(HL) > 0.1;  % 垂直边缘
    edge_HH = abs(HH) > 0.1;  % 对角边缘
    edges = edge_LH | edge_HL | edge_HH;  % 合并边缘
    
  4. 结果显示

    绘制原始图像和边缘检测结果:

    figure;
    subplot(1,2,1); imshow(img); title('原始图像');
    subplot(1,2,2); imshow(edges); title('边缘检测结果');
    

实验结果

参考代码 MATLAB下通过多种小波实验了解小波变换的原理教程及示例代码 www.youwenfan.com/contentcsr/36066.html

七、小波基选择指南

不同的小波基具有不同的时频特性,选择时需根据信号类型和分析目标调整:

小波基 特点 适用场景
Haar 最简单的正交小波,计算快,时域局部性好 边缘检测、快速原型
Daubechies(dbN) 紧支集,正交,消失矩高(N越大,光滑性越好) 去噪、压缩、特征提取
Symlets(symN) 近似对称,正则性好,相位失真小 图像增强、语音处理
Coiflets(coifN) 兼具逼近和平滑能力,适合信号重构 信号压缩、生物医学信号分析
Morlet 复值小波,频率定位能力强,含相位信息 时频分析(如振动信号、EEG)

八、注意事项

  1. 小波基与分解层数

    • 小波基的选择需根据信号特性(如突变信号选dbN,平滑信号选symN)。
    • 分解层数不宜过多(一般不超过log2(N)N为信号长度),否则会导致过拟合(噪声被保留)。
  2. 阈值处理策略

    • 软阈值('s'):将系数向0收缩,避免振铃效应(推荐用于图像/语音)。
    • 硬阈值('h'):直接置零小于阈值的系数,保留更多细节(推荐用于信号去噪)。
  3. 边界效应

    • 小波变换会在信号边界产生边界效应(系数不准确),可通过信号填充(如零填充、镜像填充)缓解。

九、总结

本教程通过一维信号分解重构小波去噪连续小波时频分析二维图像边缘检测四个实验,覆盖了小波变换的核心原理和MATLAB实现。关键结论:

 

专注于matlab/simulink,电子电路,编程