克孜勒苏柯尔克孜自治州网站建设_网站建设公司_Banner设计_seo优化
2026/1/16 21:30:54 网站建设 项目流程

小波变换是比FFT、PSD更灵活的时频分析工具——既能像FFT一样看清信号的频率成分,又能定位频率出现的时间位置,特别适合分析非平稳信号(如故障振动、语音、心电信号)。MATLAB的Wavelet Toolbox提供了从基础小波分解到可视化的全套函数,本文从原理到实战,手把手教你落地小波变换分析,代码可直接复制运行。

一、核心前提:理解小波变换的优势

1.1 小波变换vs傅里叶变换(FFT)

分析方法 核心特点 适用场景
傅里叶变换(FFT) 仅能看“频率分布”,丢失时间信息 平稳信号(如纯正弦波)
小波变换 同时看“时间-频率”分布(时频分析) 非平稳信号(如故障冲击、调频信号)

举个例子:电机正常运行时振动是50Hz平稳信号(FFT够用),但轴承故障时会出现“某一时刻的高频冲击信号”——只有小波变换能精准定位“冲击发生的时间+冲击的频率”。

1.2 无需额外配置

MATLAB默认安装Wavelet Toolbox,核心函数(wavedeccwtwenergy)直接可用,无需额外安装。

二、基础用法:2类核心小波变换(离散/连续)

小波变换分离散小波变换(DWT)连续小波变换(CWT),前者适合信号分解/特征提取,后者适合时频可视化,是工程中最常用的两种方式。

2.1 离散小波变换(DWT):信号分解与重构

核心目标

将信号分解为“低频近似分量(A)”和“高频细节分量(D)”,比如从含噪信号中提取低频有效信号,或提取高频故障特征。

完整代码(可直接运行)

%% 步骤1:生成含噪非平稳信号(模拟故障冲击)
Fs = 1000;                % 采样频率1000Hz
t = 0:1/Fs:2-1/Fs;        % 时间轴:0~2秒
% 基础信号:50Hz正弦波 + 1秒处的高频冲击(故障特征)
x = sin(2*pi*50*t) + 0.5*randn(size(t));  % 50Hz信号+噪声
x(1000:1050) = x(1000:1050) + 3*sin(2*pi*500*t(1000:1050)); % 1秒处叠加500Hz冲击% 可视化原始信号
figure(1)
plot(t, x)
title('含故障冲击的非平稳信号')
xlabel('时间 t (s)')
ylabel('幅值')
grid on;
xlim([0 2]);%% 步骤2:离散小波分解(db4小波,分解3层)
wname = 'db4';  % 小波基(db4是工程常用的小波,适合冲击信号)
level = 3;      % 分解层数(层数越多,频率分辨率越高)
[C, L] = wavedec(x, level, wname);  % C:分解系数;L:系数长度%% 步骤3:提取各层分量
% 近似分量(低频):A3(3层分解后的低频)
A3 = appcoef(C, L, wname, level);
% 细节分量(高频):D3、D2、D1(层数越高,频率越低)
D3 = detcoef(C, L, 3);
D2 = detcoef(C, L, 2);
D1 = detcoef(C, L, 1);%% 步骤4:可视化分解结果
figure(2)
subplot(5,1,1); plot(t, x); title('原始信号'); ylabel('幅值'); grid on;
% 注意:分解后的分量长度需插值还原到原长度
t_A = linspace(0, 2, length(A3));
subplot(5,1,2); plot(t_A, A3); title('A3:3层近似分量(低频)'); ylabel('幅值'); grid on;
t_D3 = linspace(0, 2, length(D3));
subplot(5,1,3); plot(t_D3, D3); title('D3:3层细节分量'); ylabel('幅值'); grid on;
t_D2 = linspace(0, 2, length(D2));
subplot(5,1,4); plot(t_D2, D2); title('D2:2层细节分量'); ylabel('幅值'); grid on;
t_D1 = linspace(0, 2, length(D1));
subplot(5,1,5); plot(t_D1, D1); title('D1:1层细节分量(高频)'); ylabel('幅值'); xlabel('时间 t (s)'); grid on;%% 步骤5:信号重构(从分解系数还原信号)
% 重构3层近似分量(去除高频噪声)
x_recon = waverec(C, L, wname);  
figure(3)
plot(t, x, 'b', t, x_recon, 'r');
title('原始信号 vs 小波重构信号(去噪后)');
xlabel('时间 t (s)'); ylabel('幅值');
legend('原始信号','重构信号'); grid on;

关键知识点解读

  1. 小波基选择
    • db4(Daubechies小波):适合机械振动、故障冲击信号;
    • sym8:适合平滑信号(如音频);
    • morl(墨西哥帽小波):适合连续小波变换的时频分析。
  2. 分解层数
    • 层数越高,低频分量(A)的频率分辨率越高,但时间分辨率越低;
    • 工程中常用3~5层,可根据信号长度调整(采样点数越多,层数可越高)。
  3. 结果解读
    • A3(近似分量):保留了50Hz低频基础信号,过滤了噪声和高频冲击;
    • D1(细节分量):清晰显示1秒处的500Hz高频冲击(故障特征),这是FFT无法定位的。

2.2 连续小波变换(CWT):时频可视化(核心实战)

核心目标

生成“时间-尺度(频率)-幅值”的时频图,直观看到不同频率成分在时间轴上的分布,是小波变换最常用的可视化方式。

完整代码(可直接运行)

%% 步骤1:生成调频信号(频率从20Hz→80Hz,非平稳)
Fs = 1000;
t = 0:1/Fs:5-1/Fs;
x = chirp(t, 20, max(t), 80) + 0.2*randn(size(t)); % 线性调频+噪声%% 步骤2:连续小波变换(CWT)
wname = 'morl';  % 墨西哥帽小波,适合时频分析
% 调用cwt函数,返回小波系数和频率轴
[wt, f] = cwt(x, wname, Fs);  % wt:小波系数(复数);f:频率轴%% 步骤3:可视化时频图(核心)
figure(4)
% 绘制时频图(颜色越深,该时间-频率点的幅值越大)
imagesc(t, f, abs(wt));  
colormap jet;  % 配色方案(jet是时频图常用配色)
colorbar;      % 颜色刻度条(对应幅值大小)
title('连续小波变换时频图(调频信号)');
xlabel('时间 t (s)');
ylabel('频率 f (Hz)');
ylim([0 100]); % 聚焦0~100Hz,匹配信号频率范围%% 步骤4:提取关键频率的时间分布(进阶)
% 提取80Hz频率对应的小波系数,看时间分布
f_target = 80;
[~, idx] = min(abs(f - f_target)); % 找到80Hz对应的索引
wt_80 = abs(wt(idx, :));figure(5)
plot(t, wt_80);
title('80Hz频率分量的时间分布');
xlabel('时间 t (s)');
ylabel('幅值');
grid on;

结果解读

  • 时频图中能清晰看到一条从20Hz(t=0)到80Hz(t=5s)的斜线,精准对应调频信号的频率变化;
  • 对比FFT只能看到“20~80Hz的频率范围”,小波变换能同时看到“频率随时间的变化轨迹”,这是核心优势。

三、工程实战:小波变换提取故障特征(轴承振动信号)

需求

从轴承振动信号中提取故障冲击特征(高频冲击+时间定位),这是工业设备故障诊断的典型场景。

核心代码

%% 步骤1:模拟轴承故障振动信号(含工频+故障冲击)
Fs = 2000;
t = 0:1/Fs:1-1/Fs;
% 50Hz工频信号 + 随机噪声 + 周期性故障冲击(0.2/0.4/0.6/0.8秒处)
x = 1.5*sin(2*pi*50*t) + 0.3*randn(size(t));
冲击位置 = round([0.2,0.4,0.6,0.8]*Fs);
for i = 1:length(冲击位置)x(冲击位置(i)-5:冲击位置(i)+5) = x(冲击位置(i)-5:冲击位置(i)+5) + 2*sin(2*pi*1000*t(冲击位置(i)-5:冲击位置(i)+5));
end%% 步骤2:连续小波变换分析
[wt, f] = cwt(x, 'morl', Fs);%% 步骤3:可视化故障特征
figure(6)
subplot(2,1,1); plot(t, x); title('轴承故障振动信号'); xlabel('时间 s'); ylabel('幅值'); grid on;
subplot(2,1,2); imagesc(t, f, abs(wt)); colormap jet; colorbar;
title('小波变换时频图(故障冲击定位)');
xlabel('时间 s'); ylabel('频率 Hz');
ylim([0 1200]); % 聚焦故障冲击的1000Hz频率

结果解读

时频图中能清晰看到0.2/0.4/0.6/0.8秒处的1000Hz高频冲击峰值,精准定位故障发生的时间和频率,这是PSD、FFT无法实现的。

四、常见坑与避坑技巧

4.1 小波基选择错误,特征提取不明显

  • 问题:用sym8分析冲击信号,或用db4分析平滑音频信号;
  • 解决:按信号类型选小波基(冲击信号选db4/db6,平滑信号选sym8,时频分析选morl)。

4.2 分解层数过高/过低

  • 问题:层数过低(❤️)频率分辨率不足,层数过高(>8)计算量大且易失真;
  • 解决:采样点数<1000时选34层,100010000时选5~6层。

4.3 时频图频率轴混乱

  • 问题:未指定采样频率Fscwt返回尺度而非频率;
  • 解决:调用cwt时必须指定Fs(如[wt, f] = cwt(x, 'morl', Fs)),直接返回频率轴f

4.4 小波系数幅值解读错误

  • 注意:小波系数的幅值是相对值,需结合wenergy函数计算各层能量占比,而非直接对比幅值;
    % 计算各层细节分量的能量占比
    [energy, ~] = wenergy(C, L);
    fprintf('D1能量占比:%.2f%%\n', energy(1)*100);
    fprintf('D2能量占比:%.2f%%\n', energy(2)*100);
    fprintf('A3能量占比:%.2f%%\n', energy(end)*100);
    

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询