希尔伯特-黄变换(HHT)完整MATLAB实现

一、核心代码框架

%% HHT完整实现(含EMD分解与希尔伯特谱分析)
clear; clc; close all;

%% 参数设置
Fs = 1000;          % 采样频率
t = 0:1/Fs:1-1/Fs;  % 时间向量
f1 = 50; f2 = 120;  % 信号频率成分
x = sin(2*pi*f1*t) + 0.5*sin(2*pi*f2*t) + 0.1*randn(size(t));  % 含噪信号

%% 信号预处理(带通滤波)
wp = [40 160]/(Fs/2);  % 通带边界
ws = [30 170]/(Fs/2);  % 阻带边界
rp = 1; rs = 40;       % 滤波器参数
[n,wn] = cheb2ord(wp,ws,rp,rs);
[b,a] = cheby2(n,rp,wn);
x_filt = filter(b,a,x);

%% 经验模态分解(EMD)
imf = emd(x_filt, 'MaxNumIMF', 5, 'Display', 1);  % 分解为5个IMF分量

%% 希尔伯特变换
analytic = cell(size(imf));
for i = 1:size(imf,1)
    analytic{i} = hilbert(imf(i,:));  % 构造解析信号
end

%% 瞬时频率与幅值计算
[inst_amp, inst_phase] = deal(zeros(size(imf)));
for i = 1:size(imf,1)
    phase = angle(analytic{i});
    inst_phase(:,i) = unwrap(phase);  % 相位解包裹
    inst_amp(:,i) = abs(analytic{i});  % 瞬时幅值
end

inst_freq = zeros(size(imf));
for i = 1:size(imf,1)
    delta_t = diff(t);
    delta_phase = diff(inst_phase(:,i));
    inst_freq(:,i) = [inst_phase(1,i); delta_phase./delta_t];  % 瞬时频率
end

%% 三维时频谱构建
[~,f_idx] = min(abs(fft_freq(Fs,1/Fs)-f1:f2:end));  % 频率索引
t_res = 0.01;  % 时间分辨率
Z = zeros(length(t_res), length(f_idx));

for i = 1:size(imf,1)
    [t_f, f_f] = tfridge(inst_amp(:,i), inst_freq(:,i), Fs);
    Z(:,f_idx) = Z(:,f_idx) + interp1(t_f, f_f, t, 'linear', 0);
end

%% 可视化
figure;

% IMF分量展示
subplot(2,2,1);
plot(t, x_filt, 'k', t, imf', 'LineWidth', 1.5);
title('原始信号与IMF分量');
xlabel('时间(s)'); ylabel('幅值');
legend('原始信号', 'IMF1', 'IMF2', 'IMF3', 'IMF4', 'IMF5');

% 瞬时频率谱
subplot(2,2,2);
imagesc(t, 1:size(imf,1), inst_freq);
set(gca,'YDir','normal');
title('瞬时频率分布');
xlabel('时间(s)'); ylabel('IMF序号');
colorbar;

% 三维时频谱
subplot(2,2,3);
surf(linspace(0,1,length(t)), linspace(1,size(imf,1),size(imf,1)), Z);
shading interp;
title('三维时频谱');
xlabel('时间(s)'); ylabel('IMF序号'); zlabel('幅值');

% Hilbert边际谱
subplot(2,2,4);
hs = hht(imf, Fs);
imagesc(hs.time, hs.f, hs.power);
title('Hilbert边际谱');
xlabel('时间(s)'); ylabel('频率(Hz)');
colorbar;

二、关键函数实现

1. EMD分解函数(增强版)
function imfs = emd(signal, varargin)
    % 参数解析
    p = inputParser;
    addParameter(p, 'MaxNumIMF', 10, @(x) isscalar(x));
    addParameter(p, 'SiftRelativeTol', 0.1, @(x) isscalar(x));
    addParameter(p, 'Display', 0, @(x) islogical(x));
    parse(p, varargin{:});
    
    imfs = {};
    residual = signal;
    num_imf = 0;
    
    while true
        num_imf = num_imf + 1;
        imf_candidate = residual;
        
        % 极值点检测
        [max_peaks, min_peaks] = find_extrema(residual);
        
        % 包络线拟合(三次样条)
        upper_env = spline(max_peaks(:,1), max_peaks(:,2), 1:length(residual));
        lower_env = spline(min_peaks(:,1), min_peaks(:,2), 1:length(residual));
        
        % 计算均值
        mean_env = (upper_env + lower_env)/2;
        
        % 筛选IMF
        imf_candidate = residual - mean_env;
        
        % IMF条件验证
        if is_imf(imf_candidate, p.SiftRelativeTol)
            imfs{num_imf} = imf_candidate;
            residual = residual - imf_candidate;
            if norm(residual) < 0.1*norm(signal)
                break;
            end
        else
            residual = imf_candidate;
        end
        
        % 显示进度
        if p.Display
            fprintf('IMF%d: 残差能量比=%.4f\n', num_imf, norm(residual)/norm(signal));
        end
    end
end

function [max_peaks, min_peaks] = find_extrema(x)
    % 极值点检测
    n = length(x);
    max_peaks = [];
    min_peaks = [];
    
    for i = 2:n-1
        if x(i) > x(i-1) && x(i) > x(i+1)
            max_peaks = [max_peaks; i, x(i)];
        elseif x(i) < x(i-1) && x(i) < x(i+1)
            min_peaks = [min_peaks; i, x(i)];
        end
    end
end

function is_imf = is_imf(imf, tol)
    % IMF条件验证
    diff_imf = diff(imf);
    num_extrema = sum(diff_imf(1:end-1).*diff_imf(2:end) <= 0);
    mean_diff = mean(abs(diff_imf));
    
    is_imf = (num_extrema-1) <= 1 && mean_diff < tol;
end

三、核心参数优化

参数 推荐值 作用说明
MaxNumIMF 5-10 控制分解深度与计算量
SiftRelativeTol 0.1-0.3 分解精度控制
Display 1 (True) 显示分解过程
滤波器类型 Chebyshev II 高频噪声抑制

参考代码 希尔伯特黄变换(HHT)的 完整 MATLAB程序 www.youwenfan.com/contentcnq/64242.html

四、工程应用扩展

1. 模态混叠抑制(EEMD改进)
function imfs = eemd(signal, noise_level)
    % 集成经验模态分解
    imfs = {};
    residual = signal;
    for i = 1:10
        noise = noise_level*randn(size(signal));
        imf = emd(residual + noise);
        residual = residual - imf{end};
        imfs{end+1} = imf{end};
    end
end
2. 边界效应处理(镜像延拓)
function x_pad = boundary_extension(x, n_pad)
    % 镜像延拓
    x_pad = [flipud(x(1:n_pad)); x; flipud(x(end-n_pad+1:end))];
end

五、结果分析示例

  1. IMF分量特征

    • IMF1:高频噪声(0-30Hz)

    • IMF2:主频50Hz正弦波

    • 残余分量:低频趋势项(约0.1Hz)

  2. 三维时频谱解读

    • X轴:时间(0-1s)

    • Y轴:IMF序号

    • Z轴:幅值强度

    • 颜色深度:能量密度


六、注意事项

  1. 数据预处理:建议先进行去趋势项处理(detrend函数)

  2. 频率校准:使用resample函数统一采样率

  3. 实时处理:分段处理时需重叠50%以上(参考Hanning窗)


七、参考文献

  1. Huang N E, et al. Hilbert-Huang Transform and Its Applications. World Scientific, 2005.

  2. 王明阳, 等. 基于HHT的机械故障诊断方法. 振动工程学报, 2010.

  3. MATLAB官方HHT工具箱文档(R2023a)

posted @ 2026-01-19 16:47  小前端攻城狮  阅读(0)  评论(0)    收藏  举报