matlab实现希尔伯特变换(HHT)

简介: matlab实现希尔伯特变换(HHT)

基于Hilbert-Huang变换(HHT)的完整MATLAB实现代码,包含经验模态分解(EMD)和希尔伯特谱分析,适用于非平稳信号处理。

HHT 代码

%% HHT变换主程序
% 输入参数
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);  % 合成信号(含噪声)

%% 信号预处理(可选)
% 带通滤波去除高频噪声
wp = [40 160]/(Fs/2);  % 通带边界
ws = [30 170]/(Fs/2);  % 阻带边界
rp = 1; rs = 40;       % 通带/阻带波纹
[n,wn] = cheb2ord(wp,ws,rp,rs);  % 计算Chebyshev II滤波器阶数
[b,a] = cheby2(n,rp,wn);        % 设计滤波器
x_filtered = filter(b,a,x);     % 应用滤波器

%% 经验模态分解(EMD)
imf = emd(x_filtered);  % 执行EMD分解
[~,num_imf] = size(imf);% 获取IMF数量

%% 希尔伯特变换
[H, f, t_hilbert] = hilbert_spectrum(imf, Fs);  % 计算希尔伯特谱

%% 可视化结果
figure;
subplot(3,1,1);
plot(t, x, 'b', t, x_filtered, 'r--');
title('原始信号与滤波后信号');
xlabel('时间(s)'); ylabel('幅值');
legend('原始信号', '滤波后信号');

subplot(3,1,2);
plot(t, imf');
title('IMF分量分解结果');
xlabel('时间(s)'); ylabel('幅值');
legend(arrayfun(@(i) sprintf('IMF%d',i),1:num_imf,'UniformOutput',false));

subplot(3,1,3);
imagesc(t_hilbert, f, abs(H));
title('希尔伯特时频谱');
xlabel('时间(s)'); ylabel('频率(Hz)');
colorbar;

%% 自定义函数定义
function imf = emd(signal)
    % 经验模态分解(EMD)实现
    % 输入: signal - 原始信号
    % 输出: imf - 分解后的本征模态函数

    N = length(signal);
    imf = [];
    residual = signal;

    while true
        % 筛选过程
        h = residual;
        sd = Inf;
        while sd > 0.3 && ~is_monotonic(h)
            max_peaks = findpeaks(h);
            min_peaks = findpeaks(-h);
            min_peaks = -min_peaks(:,2);

            upper_env = interp1([0,N], [h(1), max_peaks, h(end)], 1:N, 'pchip');
            lower_env = interp1([0,N], [h(1), min_peaks, h(end)], 1:N, 'pchip');

            mean_env = (upper_env + lower_env)/2;
            h = h - mean_env;

            sd = sum((mean_env(2:end-1) - (upper_env(2:end-1) + lower_env(2:end-1))/2).^2) / ...
                 sum((upper_env(2:end-1) + lower_env(2:end-1))/2.^2);
        end

        imf = [imf, h];
        residual = residual - h;

        if is_monotonic(residual) || length(findpeaks(residual)) < 2
            break;
        end
    end
end

function is_mono = is_monotonic(x)
    % 判断信号是否单调
    diff_x = diff(x);
    is_mono = all(diff_x >= -1e-6) || all(diff_x <= 1e-6);
end

function [H, f, t] = hilbert_spectrum(imf, Fs)
    % 希尔伯特谱计算
    [P, f] = pburg(imf, [], [], [], Fs);  % Burg功率谱估计
    t = (0:length(imf)-1)/Fs;
    H = abs(hilbert(imf));                % 希尔伯特变换
end

说明

  1. 信号预处理

    • 使用Chebyshev II滤波器(cheby2)进行带通滤波,去除高频噪声干扰。
    • 滤波参数可根据实际信号调整(wp, ws, rp, rs)。
  2. 经验模态分解(EMD)

    • 通过循环筛选过程分离IMF分量,停止条件为标准差(sd < 0.3)或信号单调性。
    • 关键步骤包括包络线拟合(三次样条插值)和残差更新。
  3. 希尔伯特变换

    • 使用hilbert函数计算解析信号,提取瞬时幅值和频率。
    • Burg功率谱估计(pburg)用于时频谱分析,平衡分辨率和计算效率。
  4. 可视化模块

    • 分别展示原始信号、IMF分量及希尔伯特时频谱。
    • 时频谱采用伪彩色图(imagesc),横轴为时间,纵轴为频率,颜色表示能量强度。

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


应用场景示

  1. 机械故障诊断
    • 分析轴承振动信号中的冲击特征,通过IMF分量定位故障频率。
  2. 生物医学信号处理
    • 提取心电信号(ECG)中的P波、QRS波群等特征,用于心律失常检测。
  3. 地球物理勘探
    • 处理地震信号中的复杂波形,识别地层结构变化。
相关文章
|
11月前
|
数据可视化 5G
Turbo码与卷积码误码率性能对比分析
Turbo码与卷积码误码率性能对比分析
|
JSON JavaScript 数据格式
Elementui Tree 树形控件删除子节点
Elementui Tree 树形控件删除子节点
612 1
|
10月前
|
编解码 算法 数据可视化
MATLAB 实现同步压缩小波变换
MATLAB 实现同步压缩小波变换
683 3
|
6月前
|
人工智能 运维 自然语言处理
知识管理提效神器:AI开源知识库实操干货全攻略
作为一名常年和技术文档、团队知识库打交道的开发者,试过不少主流的知识管理工具,从重型的商业Wiki到轻量的开源笔记,直到接触到这套AI驱动的开源知识库系统,才真正找到适配中小团队和个人开发者的知识管理解决方案。它没有复杂的部署流程,却把AI能力和知识库的核心需求做了深度融合,用了三个月下来,不管是个人知识沉淀还是团队协作,效率都提升了不少,今天就和大家聊聊这套工具的实操干货和真实使用感受。
875 3
|
JSON 前端开发 JavaScript
惊艳!阿里开源 15.2k Star 企业级低代码引擎揭秘,如何变革前端开发方式?
阿里巴巴开源的 LowCodeEngine 是一款企业级低代码引擎,具备可视化编排、UI 渲染、代码生成等全链路能力。支持 React、Vue、Rax 等框架,提供高扩展性与类型安全,助力高效开发,降低维护成本,适用于后台系统、多端同步等场景。
1841 1
|
7月前
|
机器学习/深度学习 供应链 算法
鲸鱼算法WOA-XGBoost回归+SHAP分析+新数据预测附Matlab代码实现
🔥 内容介绍 一、引言:XGBoost 回归的痛点与 WOA 优化解决方案 1.1 实际场景需求与传统 XGBoost 的核心缺陷 在电商销量预测(多特征→销量)、能源负荷预测(气象 + 负荷历史→用电量)、医疗指标预测(多生理参数→风险值)等多输入单输出回归场景中,XGBoost 因树集成优势成为主流选择,但存在两大关键痛点: 超参数维度高(学习率、树深度、叶子节点数等 10 + 参数),手动调参 / 网格搜索易陷入局部最优,泛化能力不稳定; 关键超参数(如max_depth、subsample)的耦合性强,经验调参难以平衡过拟合与欠拟合; 虽支持特征重要性输出,但缺乏量化的特
219 5
|
12月前
|
机器学习/深度学习 传感器 边缘计算
Koopman-MPC: 基于数据驱动的学习和控制四旋翼无人机研究(Matlab代码实现)
Koopman-MPC: 基于数据驱动的学习和控制四旋翼无人机研究(Matlab代码实现)
422 0
|
人工智能 文字识别 小程序
告别手动录入!AI自动识别发票
最近有朋友向我吐槽:"每天对着几十张发票手动录入系统,眼睛都快看花了,还总担心数字打错。" 这种重复性高、容错率低的工作,确实让财务和行政人员苦不堪言。作为程序员,我深知这类场景完全可以通过技术手段优化
1094 1
|
算法 计算机视觉 索引
【OpenCV图像处理12】特征检测与匹配(下)
【OpenCV图像处理12】特征检测与匹配(下)
722 0