一、EWT理论基础与核心思想
1.1 EWT与传统方法的对比
| 方法 | 分解方式 | 自适应性 | 理论基础 | 模态混叠 |
|---|---|---|---|---|
| EMD | 基于极值点的自适应分解 | 强 | 经验性,缺乏数学基础 | 严重 |
| 小波变换 | 固定小波基分解 | 弱 | 完善数学理论 | 无,但基函数固定 |
| EWT | 自适应频谱分割+小波滤波 | 强 | 严格的数学框架 | 极少 |
1.2 EWT核心创新点
- 自适应频谱分割:基于傅里叶频谱的局部极大值自动划分频带
- 正交小波滤波器组:在每个频带构造Meyer小波函数
- 完美重构:保证分解与重构的无损性
- 数学可解释性:不同于EMD的经验性,EWT有严格的数学证明
二、MATLAB实现
2.1 EWT主函数(ewt.m)
matlab
function [imfs, bounds] = ewt(signal, varargin)
% 经验小波变换 (Empirical Wavelet Transform)
% 输入:
% signal - 输入信号 (1D向量)
% varargin - 可选参数: 'N', 'log', 'tau', 'sigma'
% 输出:
% imfs - 分解得到的IMFs (每行一个IMF)
% bounds - 频谱分割边界
% 参数设置
N = 3; % 最小极值点数量
use_log = true; % 是否使用对数尺度
tau = 0.5; % 边界紧致因子 (0-1)
sigma = 0.1; % 小波形状参数
% 解析输入参数
for i = 1:2:length(varargin)
switch lower(varargin{i})
case 'n', N = varargin{i+1};
case 'log', use_log = varargin{i+1};
case 'tau', tau = varargin{i+1};
case 'sigma', sigma = varargin{i+1};
end
end
% 信号基本信息
L = length(signal);
Fs = 1; % 归一化频率
% ========== 1. 频谱分析 ==========
% 计算傅里叶变换
fft_signal = fft(signal);
mag = abs(fft_signal(1:ceil(L/2)));
freq = (0:ceil(L/2)-1) * Fs/L;
% 对数变换增强低频分辨率
if use_log
mag_log = log(mag + 1e-10);
else
mag_log = mag;
end
% ========== 2. 自适应频谱分割 ==========
bounds = adaptive_spectrum_segmentation(mag_log, freq, N, tau);
% ========== 3. 构造经验小波滤波器组 ==========
filters = build_empirical_wavelets(bounds, L, sigma);
% ========== 4. 滤波分解 ==========
imfs = zeros(length(bounds)-1, L);
for k = 1:length(bounds)-1
% 频域滤波
filtered_fft = fft_signal .* filters(k, :)';
% 逆傅里叶变换得到IMF
imfs(k, :) = real(ifft(filtered_fft));
end
end
%% 自适应频谱分割函数
function bounds = adaptive_spectrum_segmentation(mag, freq, N, tau)
% 基于局部极大值的自适应频谱分割
% 输入:
% mag - 频谱幅度
% freq - 频率轴
% N - 最小极值点数量
% tau - 边界紧致因子
% 输出:
% bounds - 分割边界
L = length(mag);
M = L; % 滤波器长度
% 1. 寻找局部极大值
[peaks, locs] = findpeaks(mag, 'SortStr', 'descend');
% 2. 筛选显著峰值 (至少N个极值点)
if length(peaks) < N
peaks = peaks(1:min(N, length(peaks)));
locs = locs(1:min(N, length(locs)));
end
% 3. 按频率排序
[locs_sorted, idx] = sort(locs);
peaks_sorted = peaks(idx);
% 4. 计算边界 (在相邻峰值之间)
bounds = zeros(length(locs_sorted)+2, 1);
bounds(1) = 1; % 从DC开始
for i = 1:length(locs_sorted)-1
% 两峰值之间的中点
mid_point = round((locs_sorted(i) + locs_sorted(i+1)) / 2);
% 应用tau因子调整边界
adjustment = round(tau * (locs_sorted(i+1) - locs_sorted(i)) / 2);
bounds(i+1) = max(locs_sorted(i) + adjustment, bounds(i)+1);
end
% 最后一个边界
bounds(end) = L;
% 确保边界单调递增
bounds = unique(bounds);
end
%% 构造经验小波滤波器组
function filters = build_empirical_wavelets(bounds, L, sigma)
% 构造Meyer型经验小波滤波器
% 输入:
% bounds - 频谱分割边界
% L - 信号长度
% sigma - 小波形状参数
% 输出:
% filters - 滤波器组 (每行一个滤波器)
num_filters = length(bounds)-1;
filters = zeros(num_filters, L);
% 频率轴 (0到Nyquist)
freq = (0:L-1) * (1/L);
for k = 1:num_filters
% 当前频带边界
w1 = (bounds(k)-1) / L;
w2 = (bounds(k+1)-1) / L;
% Meyer小波函数
for i = 1:L
w = freq(i);
if w < w1
filters(k, i) = 0;
elseif w >= w1 && w <= w2
% 过渡带: 使用余弦调制
filters(k, i) = cos(pi/2 * phi(sigma * (w - w1)/(w2 - w1)));
else
filters(k, i) = 0;
end
end
% 对称性 (负频率部分)
filters(k, L/2+2:end) = fliplr(filters(k, 2:L/2));
end
% 归一化保证单位增益
for k = 1:num_filters
filters(k, :) = filters(k, :) / max(abs(filters(k, :)));
end
end
%% Meyer小波辅助函数
function y = phi(x)
% Meyer小波辅助函数
if x < 0
y = 0;
elseif x >= 0 && x <= 1
y = 1;
else
y = 0;
end
end
2.2 EWT快速实现(简化版)
matlab
%% EWT快速实现 (简化版,适合初学者)
function [imfs, bounds] = ewt_fast(signal, num_modes)
% 快速EWT实现
% num_modes - 指定分解的模态数量
L = length(signal);
fft_sig = fft(signal);
mag = abs(fft_sig(1:ceil(L/2)));
% 简单频谱分割: 均匀分割
freq_bins = ceil(L/2);
segment_size = floor(freq_bins / num_modes);
bounds = 1:segment_size:freq_bins;
bounds(end) = freq_bins;
% 构造矩形滤波器 (简化版)
filters = zeros(num_modes, L);
for k = 1:num_modes
start_idx = bounds(k);
end_idx = min(bounds(k+1), L/2);
filters(k, start_idx:end_idx) = 1;
filters(k, L-end_idx+2:L-start_idx+2) = 1; % 对称部分
end
% 滤波分解
imfs = zeros(num_modes, L);
for k = 1:num_modes
filtered_fft = fft_sig .* filters(k, :)';
imfs(k, :) = real(ifft(filtered_fft));
end
end
三、EWT应用实例
3.1 非平稳信号分解
matlab
%% 示例1: 多分量非平稳信号分解
clc; clear; close all;
% ========== 生成测试信号 ==========
Fs = 1000; % 采样频率
t = 0:1/Fs:2-1/Fs; % 时间向量 (2秒)
% 分量1: 低频正弦 (5Hz)
s1 = 2 * sin(2*pi*5*t);
% 分量2: 中频调频信号 (20-50Hz)
s2 = 1.5 * sin(2*pi*(20 + 15*t)*t);
% 分量3: 高频脉冲 (100Hz)
s3 = 0.8 * sin(2*pi*100*t) .* exp(-((t-1)/0.1).^2);
% 分量4: 噪声
noise = 0.3 * randn(size(t));
% 合成信号
signal = s1 + s2 + s3 + noise;
% ========== 执行EWT分解 ==========
fprintf('正在执行EWT分解...\n');
tic;
[imfs, bounds] = ewt(signal, 'N', 4, 'tau', 0.3, 'sigma', 0.1);
toc;
% ========== 可视化结果 ==========
figure('Position', [100, 100, 1400, 900], 'Color', 'w');
% 原始信号
subplot(4, 3, 1);
plot(t, signal, 'k-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('原始信号');
grid on;
% 频谱
subplot(4, 3, 2);
NFFT = length(signal);
f = (0:NFFT-1)*(Fs/NFFT);
plot(f(1:NFFT/2), abs(fft(signal)(1:NFFT/2)), 'b-', 'LineWidth', 1.5);
xlabel('频率 (Hz)'); ylabel('幅度');
title('信号频谱');
grid on; xlim([0, 150]);
% 频谱分割边界
subplot(4, 3, 3);
mag = abs(fft(signal)(1:NFFT/2));
freq_axis = (0:NFFT/2-1)*(Fs/NFFT);
plot(freq_axis, mag, 'b-', 'LineWidth', 1.5); hold on;
for i = 1:length(bounds)-1
line([bounds(i), bounds(i)]*Fs/NFFT, [0, max(mag)], 'Color', 'r', 'LineStyle', '--');
end
xlabel('频率 (Hz)'); ylabel('幅度');
title('自适应频谱分割');
grid on; xlim([0, 150]);
% IMF1 (低频分量)
subplot(4, 3, 4);
plot(t, imfs(1, :), 'b-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('IMF1: 低频分量 (~5Hz)');
grid on;
% IMF2 (中频分量)
subplot(4, 3, 5);
plot(t, imfs(2, :), 'g-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('IMF2: 中频分量 (~35Hz)');
grid on;
% IMF3 (高频分量)
subplot(4, 3, 6);
plot(t, imfs(3, :), 'r-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('IMF3: 高频分量 (~100Hz)');
grid on;
% IMF4 (残余分量)
subplot(4, 3, 7);
plot(t, imfs(4, :), 'm-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('IMF4: 残余分量 (噪声)');
grid on;
% 重构信号
subplot(4, 3, 8);
reconstructed = sum(imfs, 1);
plot(t, reconstructed, 'k-', 'LineWidth', 1.5); hold on;
plot(t, signal, 'r--', 'LineWidth', 1);
xlabel('时间 (s)'); ylabel('幅度');
title('信号重构 (完美重构验证)');
legend('重构信号', '原始信号');
grid on;
% 重构误差
subplot(4, 3, 9);
error = signal - reconstructed;
plot(t, error, 'k-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('误差');
title('重构误差 (应接近0)');
grid on;
% 各IMF频谱
subplot(4, 3, 10);
for i = 1:size(imfs, 1)
f_imf = abs(fft(imfs(i, :)));
plot(f(1:NFFT/2), f_imf(1:NFFT/2), 'LineWidth', 1.5); hold on;
end
xlabel('频率 (Hz)'); ylabel('幅度');
title('各IMF频谱分布');
legend('IMF1', 'IMF2', 'IMF3', 'IMF4');
grid on; xlim([0, 150]);
% 瞬时频率分析 (Hilbert变换)
subplot(4, 3, 11);
for i = 2:3 % 分析两个主要分量
analytic_signal = hilbert(imfs(i, :));
inst_freq = diff(unwrap(angle(analytic_signal))) * Fs/(2*pi);
plot(t(1:end-1), inst_freq, 'LineWidth', 1.5); hold on;
end
xlabel('时间 (s)'); ylabel('瞬时频率 (Hz)');
title('瞬时频率分析');
legend('IMF2', 'IMF3');
grid on; ylim([0, 120]);
% 能量分布
subplot(4, 3, 12);
energy = sum(imfs.^2, 2);
pie(energy/sum(energy)*100, {'IMF1 (5Hz)', 'IMF2 (35Hz)', 'IMF3 (100Hz)', 'IMF4 (噪声)'});
title('各IMF能量分布 (%)');
sgtitle('经验小波变换(EWT)信号分解结果', 'FontSize', 16, 'FontWeight', 'bold');
3.2 轴承故障诊断应用
matlab
%% 示例2: 轴承故障诊断 (工业应用)
clc; clear; close all;
% ========== 模拟轴承故障振动信号 ==========
Fs = 12000; % 采样频率 12kHz
t = 0:1/Fs:0.5-1/Fs; % 0.5秒数据
% 轴承参数
inner_race_freq = 162; % 内圈故障特征频率
ball_pass_freq = 105; % 滚动体通过频率
cage_freq = 12; % 保持架频率
% 故障冲击信号
fault_impulses = zeros(size(t));
impulse_interval_inner = round(Fs / inner_race_freq);
impulse_interval_ball = round(Fs / ball_pass_freq);
for i = 1:impulse_interval_inner:length(t)
fault_impulses(i) = 1;
end
for i = 1:impulse_interval_ball:length(t)
fault_impulses(i) = fault_impulses(i) + 0.7;
end
% 共振响应 (高频衰减振荡)
resonance = 2000; % 共振频率 2kHz
decay = 500; % 衰减系数
vibration = zeros(size(t));
for i = 1:length(t)
if fault_impulses(i) > 0
vibration(i:end) = vibration(i:end) + ...
fault_impulses(i) * exp(-decay*(t(i:end)-t(i))) .* sin(2*pi*resonance*(t(i:end)-t(i)));
end
end
% 添加噪声和背景干扰
noise = 0.5 * randn(size(t));
background = 0.3 * sin(2*pi*50*t); % 工频干扰
signal = vibration + background + noise;
% ========== EWT故障特征提取 ==========
fprintf('正在执行轴承故障诊断...\n');
% 使用EWT分解
[imfs, bounds] = ewt(signal, 'N', 5, 'tau', 0.4, 'sigma', 0.08);
% 寻找包含故障特征的IMF
fault_energy = zeros(size(imfs, 1), 1);
fault_freq_detected = zeros(size(imfs, 1), 1);
for i = 1:size(imfs, 1)
% 计算包络谱
analytic = hilbert(imfs(i, :));
envelope = abs(analytic);
envelope_spectrum = abs(fft(envelope));
% 寻找故障特征频率
f = (0:length(envelope_spectrum)-1) * Fs/length(envelope_spectrum);
[~, idx] = max(envelope_spectrum(round(inner_race_freq*length(envelope_spectrum)/Fs)));
fault_freq_detected(i) = f(idx);
fault_energy(i) = max(envelope_spectrum);
end
% 选择故障特征最明显的IMF
[~, fault_imf_idx] = max(fault_energy);
% ========== 可视化结果 ==========
figure('Position', [50, 50, 1600, 1000], 'Color', 'w');
% 原始振动信号
subplot(4, 4, 1);
plot(t, signal, 'k-', 'LineWidth', 1);
xlabel('时间 (s)'); ylabel('加速度 (g)');
title('轴承振动信号');
grid on;
% 时域波形放大
subplot(4, 4, 2);
zoom_start = 0.1; zoom_end = 0.15;
idx_zoom = t >= zoom_start & t <= zoom_end;
plot(t(idx_zoom), signal(idx_zoom), 'r-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('加速度 (g)');
title('冲击特征放大图');
grid on;
% 频谱分析
subplot(4, 4, 3);
N = length(signal);
f = (0:N-1)*(Fs/N);
plot(f(1:N/2), abs(fft(signal)(1:N/2)), 'b-', 'LineWidth', 1.5);
xlabel('频率 (Hz)'); ylabel('幅值');
title('振动频谱');
grid on; xlim([0, 3000]);
% 包络谱
subplot(4, 4, 4);
analytic = hilbert(signal);
envelope = abs(analytic);
envelope_spectrum = abs(fft(envelope));
plot(f(1:N/2), envelope_spectrum(1:N/2), 'g-', 'LineWidth', 1.5);
xlabel('频率 (Hz)'); ylabel('幅值');
title('包络谱');
grid on; xlim([0, 300]);
yline(inner_race_freq, 'r--', 'LineWidth', 1.5, 'Label', '内圈故障频率');
yline(ball_pass_freq, 'b--', 'LineWidth', 1.5, 'Label', '滚动体频率');
% EWT分解结果
for i = 1:min(6, size(imfs, 1))
subplot(4, 4, 4+i);
plot(t, imfs(i, :), 'LineWidth', 1.2);
xlabel('时间 (s)'); ylabel('幅值');
title(sprintf('IMF%d (故障能量: %.2f)', i, fault_energy(i)));
grid on;
end
% 故障特征IMF的包络谱
subplot(4, 4, 11);
fault_imf = imfs(fault_imf_idx, :);
analytic_fault = hilbert(fault_imf);
envelope_fault = abs(analytic_fault);
envelope_spec_fault = abs(fft(envelope_fault));
plot(f(1:N/2), envelope_spec_fault(1:N/2), 'r-', 'LineWidth', 1.5);
xlabel('频率 (Hz)'); ylabel('幅值');
title(sprintf('IMF%d包络谱 (故障特征最明显)', fault_imf_idx));
grid on; xlim([0, 300]);
yline(inner_race_freq, 'r--', 'LineWidth', 1.5, 'Label', '内圈故障频率');
% 诊断结论
subplot(4, 4, [12, 16]);
axis off;
diagnosis_text = {
'=== 轴承故障诊断报告 ===';
'';
sprintf('故障特征频率检测: %.1f Hz', fault_freq_detected(fault_imf_idx));
sprintf('最可能故障类型: %s', ...
fault_freq_detected(fault_imf_idx) > 150 && fault_freq_detected(fault_imf_idx) < 170 ? ...
'内圈故障' : '滚动体故障');
'';
sprintf('故障严重程度: %s', ...
fault_energy(fault_imf_idx) > 0.5 ? '严重' : '轻微');
'';
'建议措施:';
'1. 立即停机检查轴承内圈';
'2. 更换受损轴承';
'3. 加强振动监测频率';
};
text(0.1, 0.9, diagnosis_text, 'FontSize', 12, 'VerticalAlignment', 'top');
title('智能诊断结论', 'FontSize', 14, 'FontWeight', 'bold');
sgtitle('基于EWT的轴承故障诊断系统', 'FontSize', 16, 'FontWeight', 'bold');
四、EWT与其他方法的性能对比
4.1 定量性能评估
matlab
%% EWT性能评估函数
function evaluate_ewt_performance()
% 生成测试信号
Fs = 1000;
t = 0:1/Fs:1-1/Fs;
% 多分量信号
s1 = sin(2*pi*10*t);
s2 = 0.8*sin(2*pi*50*t);
s3 = 0.6*sin(2*pi*120*t);
noise = 0.2*randn(size(t));
signal = s1 + s2 + s3 + noise;
% 方法1: EWT分解
tic;
[imfs_ewt, ~] = ewt(signal, 'N', 3);
time_ewt = toc;
% 方法2: EMD分解
tic;
imfs_emd = emd(signal);
time_emd = toc;
% 方法3: 小波包分解
tic;
[c, l] = wavedec(signal, 3, 'db4');
imfs_wavelet = zeros(8, length(signal));
for i = 1:8
coeffs = zeros(size(c));
start_idx = sum(l(1:i-1)) + 1;
end_idx = sum(l(1:i));
coeffs(start_idx:end_idx) = c(start_idx:end_idx);
imfs_wavelet(i, :) = waverec(coeffs, l, 'db4');
end
time_wavelet = toc;
% 评估指标
metrics = zeros(3, 4); % [方法, {正交性, 重构误差, 模态混叠, 时间}]
% 1. 正交性 (各IMF间相关性)
corr_ewt = 0;
for i = 1:size(imfs_ewt, 1)
for j = i+1:size(imfs_ewt, 1)
corr_ewt = corr_ewt + abs(corr(imfs_ewt(i, :)', imfs_ewt(j, :)'));
end
end
metrics(1, 1) = corr_ewt / (size(imfs_ewt, 1)*(size(imfs_ewt, 1)-1)/2);
% 2. 重构误差
reconstructed_ewt = sum(imfs_ewt, 1);
metrics(1, 2) = mean((signal - reconstructed_ewt).^2);
% 3. 模态混叠 (通过频谱重叠评估)
overlap_ewt = 0;
for i = 1:size(imfs_ewt, 1)
fft_imf = abs(fft(imfs_ewt(i, :)));
for j = i+1:size(imfs_ewt, 1)
fft_imf2 = abs(fft(imfs_ewt(j, :)));
overlap_ewt = overlap_ewt + sum(min(fft_imf, fft_imf2)) / sum(fft_imf);
end
end
metrics(1, 3) = overlap_ewt;
% 4. 计算时间
metrics(1, 4) = time_ewt;
% 类似计算EMD和小波包的指标...
% (此处简化,实际应完整计算)
% 可视化对比
figure('Position', [100, 100, 1200, 400]);
subplot(1, 3, 1);
bar([metrics(1, 1), metrics(1, 2), metrics(1, 3)]);
set(gca, 'XTickLabel', {'正交性', '重构误差', '模态混叠'});
ylabel('指标值 (越小越好)');
title('EWT性能指标');
grid on;
subplot(1, 3, 2);
bar([time_ewt, time_emd, time_wavelet]);
set(gca, 'XTickLabel', {'EWT', 'EMD', '小波包'});
ylabel('计算时间 (秒)');
title('计算效率对比');
grid on;
subplot(1, 3, 3);
% 综合评分 (归一化后加权平均)
scores = [1-metrics(1,1), 1-metrics(1,2), 1-metrics(1,3), 1/time_ewt];
bar(scores);
set(gca, 'XTickLabel', {'正交性', '重构性', '分离性', '速度'});
ylabel('综合得分 (越高越好)');
title('EWT综合性能评分');
grid on;
sgtitle('EWT与EMD、小波包性能对比', 'FontSize', 14);
end
参考代码 EWT经验小波matlab应用实现(信号处理) www.youwenfan.com/contentcsu/55143.html
五、工程应用建议
5.1 参数选择指南
| 参数 | 推荐值 | 说明 | 调整建议 |
|---|---|---|---|
| N (最小极值点) | 3-5 | 控制分解层数 | 复杂信号选大值,简单信号选小值 |
| tau (边界紧致因子) | 0.3-0.7 | 控制频带宽度 | 噪声大时减小,信号纯净时增大 |
| sigma (小波形状) | 0.05-0.2 | 控制过渡带陡峭度 | 频率分辨率要求高时减小 |
| use_log | true | 是否使用对数频谱 | 低频丰富的信号设为true |
5.2 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 模态混叠 | 频谱分割不当 | 调整tau参数,增加N值 |
| 重构误差大 | 滤波器设计问题 | 检查sigma参数,确保边界合理 |
| 丢失重要分量 | 极值点检测不全 | 增大N值,使用对数频谱 |
| 计算速度慢 | 信号过长 | 分段处理,使用快速EWT版本 |
5.3 实际应用流程
matlab
%% EWT工程应用标准流程
function standard_ewt_pipeline(signal, Fs, application)
% 标准EWT处理流程
% 1. 预处理
signal_filtered = bandpass(signal, [5, Fs/2-5], Fs); % 带通滤波
signal_detrended = detrend(signal_filtered); % 去趋势
% 2. 自适应EWT分解
[imfs, bounds] = ewt(signal_detrended, 'N', 4, 'tau', 0.4);
% 3. 根据应用选择IMF
switch application
case 'bearing_fault'
% 选择高频IMF进行包络分析
fault_imf = select_fault_imf(imfs, Fs);
[health_status, severity] = diagnose_bearing(fault_imf, Fs);
case 'gear_fault'
% 选择啮合频率附近的IMF
gear_imf = select_gear_imf(imfs, Fs);
[fault_type, location] = diagnose_gear(gear_imf, Fs);
case 'power_quality'
% 选择基波和谐波IMF
fundamental_imf = imfs(1, :); % 基波
harmonic_imfs = imfs(2:end-1, :); % 谐波
[distortion, harmonics] = analyze_power_quality(fundamental_imf, harmonic_imfs);
end
% 4. 结果可视化与报告
generate_report(imfs, bounds, Fs, application);
end
六、总结
EWT(经验小波变换)的核心优势:
- 数学严谨性:不同于EMD的经验性,EWT有严格的数学理论基础
- 自适应分解:自动根据信号频谱特性进行最优分割
- 完美重构:保证分解与重构的无损性
- 抗模态混叠:通过频带分割有效避免模态混叠问题
- 计算高效:相比EMD,计算复杂度更低且稳定
代码使用建议:
- 先从简化版
ewt_fast开始理解基本原理 - 实际应用中使用完整版
ewt函数 - 根据具体信号调整
N、tau、sigma参数 - 结合包络分析、瞬时频率分析等方法进行特征提取