基于MATLAB的HHT变换完整实现(含EMD分解与三维时频谱生成)

一、核心流程设计
复制代码
% 主程序流程
[原始信号] → [EMD分解] → [IMF分量] → [希尔伯特变换] → [幅值/相位/瞬时频率] → [三维时频谱]

二、完整MATLAB代码实现
matlab 复制代码
%% 参数设置
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.3*randn(size(t)); % 含噪信号

%% EMD分解(关键步骤)
imf = emd(x, 'MaxNumIMF', 5, 'Display', 1); % 分解为5个IMF分量
residual = emd(x, 'Interpolation', 'pchip'); % 残差分量

%% 希尔伯特变换(特征提取)
analytic = cell(size(imf));
for i = 1:size(imf,2)
    analytic{i} = hilbert(imf(:,i)); % 解析信号计算
end

% 瞬时特征提取
[inst_amp, inst_phase] = deal(zeros(size(imf)));
inst_freq = cell(size(imf));
for i = 1:size(imf,2)
    phase = angle(analytic{i}); 
    inst_amp(:,i) = abs(analytic{i}); % 幅值谱
    inst_phase(:,i) = unwrap(phase); % 相位谱
    
    % 瞬时频率计算(改进方法)
    delta_t = diff(t);
    delta_phase = diff(inst_phase(:,i));
    inst_freq{i} = [inst_phase(1,i); delta_phase./(2*pi*delta_t)]; % 弧度/秒
end

%% 三维时频谱构建
[~,f_idx] = min(abs(fft_freq(fs,1/fs)-50:1:120)); % 频率索引
t_res = 0.01; % 时间分辨率
f_res = 1; % 频率分辨率

% 构建时频矩阵(Ridge提取算法)
Z = zeros(length(t_res), length(f_idx));
for i = 1:size(imf,2)
    [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;

% 子图1:IMF分量与原始信号
subplot(3,2,1);
plot(t, x, 'k', t, imf(:,1), 'r', t, imf(:,2), 'b');
title('原始信号与IMF分量'); 
xlabel('时间(s)'); ylabel('幅值');

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

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

% 子图4:Hilbert时频谱
subplot(3,2,4);
hs = hht(imf,fs); 
imagesc(hs.time, hs.f, hs.power);
title('Hilbert时频谱');
xlabel('时间(s)'); ylabel('频率(Hz)');
colorbar;

三、参数优化
参数 推荐值 作用说明 代码实现位置
MaxNumIMF 5-10 控制分解深度与计算量 emd()函数
SiftRelativeTol 0.1-0.3 分解精度控制 emd()函数
Interpolation 'pchip' 减少端点效应 emd()函数
tfridge窗长 信号长度 时频脊线提取精度 tfridge()函数
频率插值方法 三次样条 提升频率分辨率 interp1()函数

四、结果分析要点
  1. IMF分量验证

    • 检查每个IMF是否满足窄带条件(带宽<0.3倍采样率/长度)

    • 计算重构误差:

      matlab 复制代码
      reconstruction_error = norm(x - sum(imf,2))/norm(x);
  2. 时频特征提取 幅值谱 :反映信号能量随时间和频率的分布 相位谱 :显示信号相位随时间的变化规律 瞬时频率 :通过inst_freq = diff(phase)/(2*pi*dt)计算

  3. 三维时频谱优化 使用Ridge提取算法增强主频线 采用对数频率轴提升低频分辨率

参考代码 HHT变换,通过对实测波进行EMD分解为IMF,生成幅值,相位谱,瞬时频率,三维时频谱 www.youwenfan.com/contentcsv/84545.html

五、工程应用案例
  1. 机械故障诊断 轴承故障信号分解后,IMF2出现120Hz特征频率(对应外圈损伤)
  2. 生物医学信号分析 ECG信号分解后,IMF1对应QRS波群,IMF2对应P波
  3. 地球物理勘探 地震信号分解后,高频IMF对应微破裂事件

六、常见问题解决方案
  1. 模态混叠 改用EEMD(集合经验模态分解) 增加停止阈值至0.3-0.5

  2. 端点效应

    • 采用镜像延拓法:

      matlab 复制代码
      function x_pad = boundary_extension(x,n_pad)
          x_pad = [flipud(x(1:n_pad)); x; flipud(x(end-n_pad+1:end))];
      end
  3. 频率漂移

    • 对长时间信号分段处理(每段1024点)

    • 使用自适应窗长:

      matlab 复制代码
      window = 2^nextpow2(len(segment));

七、扩展功能实现
  1. 边际谱计算

    matlab 复制代码
    marginal_spectrum = sum(inst_freq, axis=0) * fs/length(inst_freq);
  2. 时频分辨率优化

    matlab 复制代码
    opts.t = 0.1;    % 时间分辨率
    opts.f = 1;      % 频率分辨率
    [hs, f, t] = hht(IMFs, fs, opts);
  3. 交互式可视化

    matlab 复制代码
    import plotly.graph_objects as go
    fig = go.Figure(data=[go.Surface(z=Z, x=time_grid, y=freq_grid)])
    fig.update_layout(title='Interactive 3D HHT Spectrum')
    fig.show()
相关推荐
kruptos1 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌2 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
find1star2 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing2 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21122 小时前
力扣160 21 86
算法·leetcode·职场和发展
benchmark_cc3 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库3 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H3 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒3 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP3 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理