MATLAB实现经验模态分解(EMD)与希尔伯特变换获取能量谱

一、代码

matlab 复制代码
%% 信号生成与预处理
fs = 1000; % 采样率
t = 0:1/fs:1; % 时间向量
% 生成测试信号(含多分量)
x = sin(2*pi*50*t) + 0.5*sin(2*pi*150*t) + 0.2*randn(size(t)); 

%% EMD分解
imf = emd(x, 'Interpolation', 'pchip', 'Display', 1); % 分解IMF分量
residual = emd(x, 'Interpolation', 'pchip', 'Display', 0); % 残余分量

%% 希尔伯特变换与能量计算
num_IMF = size(imf, 2);
energy_spectrum = zeros(num_IMF, length(t));

for i = 1:num_IMF
    % 希尔伯特变换
    analytic_signal = hilbert(imf(:,i));
    inst_amp = abs(analytic_signal); % 瞬时振幅
    inst_phase = unwrap(angle(analytic_signal)); % 瞬时相位
    inst_freq = (diff(inst_phase)/(2*pi)) * fs; % 瞬时频率
    
    % 能量密度计算
    energy = inst_amp.^2; % 能量密度
    
    % 时频分布
    energy_spectrum(i,:) = energy;
end

%% 能量谱可视化
figure;
for i = 1:num_IMF
    subplot(num_IMF+1,1,i);
    imagesc(t, [1,num_IMF], energy_spectrum');
    set(gca, 'YDir', 'normal');
    title(sprintf('IMF%d 能量分布', i));
    xlabel('时间 (s)');
    ylabel('IMF分量');
end
subplot(num_IMF+1,1,num_IMF+1);
plot(t, sum(energy_spectrum,1));
title('总能量谱');
xlabel('时间 (s)');
ylabel('总能量');

二、关键参数

参数 推荐值 作用说明
Interpolation 'pchip' 三次样条插值减少端点效应
Display 1 显示分解进度与IMF数量
窗函数 hann(256) STFT时频分析窗长选择
重叠率 50% 平衡时频分辨率与计算量

三、结果分析要点

  1. IMF分量特性 前3个IMF通常包含主要频率成分(示例中50Hz和150Hz) 残余分量反映信号趋势项
  2. 能量分布特征 各IMF能量集中在对应频率段(如IMF1能量集中在50Hz附近) 总能量谱呈现多峰结构,反映信号多分量特性
  3. 时频分辨率 短时傅里叶变换(STFT)的频率分辨率由窗长决定 建议使用nfft=1024保证频谱细节

四、高级功能

1. 边际谱计算
matlab 复制代码
% 计算边际谱(频率能量累积)
marginal_spectrum = sum(energy_spectrum, 1);
figure;
plot(linspace(0,fs/2,length(marginal_spectrum)), marginal_spectrum);
title('边际谱');
xlabel('频率 (Hz)');
ylabel('能量');
2. 三维能量谱可视化
matlab 复制代码
% 创建三维能量谱矩阵
[X,Y] = meshgrid(t, 1:num_IMF);
Z = energy_spectrum';

% 绘制三维曲面
figure;
surf(X, Y, Z, 'EdgeColor', 'none');
xlabel('时间 (s)');
ylabel('IMF分量');
zlabel('能量密度');
shading interp;

五、工程应用案例

1. 机械故障诊断(轴承振动信号)
matlab 复制代码
% 加载轴承振动数据
load('bearing_signal.mat');
x = bearing_signal;

% EMD分解与能量分析
imf = emd(x);
energy_spectrum = compute_energy_spectrum(imf);

% 特征频率检测
fault_freq = detect_fault_frequency(energy_spectrum, 1000);
2. 生物医学信号分析(心电ECG)
matlab 复制代码
% 加载ECG信号
load('ecg_signal.mat');
x = ecg_signal;

% 去噪处理
imf = emd(x);
clean_signal = sum(imf(:,1:2), 2);

% 能量特征提取
energy_features = sum(energy_spectrum, 2);

六、参考资料

  1. 《Hilbert-Huang Transform and Its Applications》(Norden E. Huang)
  2. 代码 emd分解之后再进行希尔伯特变换,获得能量谱 www.youwenfan.com/contentcsk/77762.html
  3. MATLAB官方文档: emd函数说明 ww2.mathworks.cn/help/signal/ref/emd.html
  4. 专利CN113267837A:改进的EMD端点处理方法
相关推荐
老蒋新思维6 小时前
创客匠人:从个人IP到知识变现,如何构建可持续的内容生态?
大数据·网络·人工智能·网络协议·tcp/ip·创客匠人·知识变现
梅孔立6 小时前
【实用教程】python 批量解析 EML 邮件文件 存成txt ,可以利用 AI 辅助快速生成年终总结
开发语言·python
HyperAI超神经6 小时前
GPT-5全面领先,OpenAI发布FrontierScience,「推理+科研」双轨检验大模型能力
人工智能·gpt·ai·openai·benchmark·基准测试·gpt5.2
老蒋新思维6 小时前
创客匠人洞察:从“个人品牌”到“系统物种”——知识IP的终极进化之路
网络·人工智能·网络协议·tcp/ip·重构·创客匠人·知识变现
阿杰学AI6 小时前
AI核心知识57——大语言模型之MoE(简洁且通俗易懂版)
人工智能·ai·语言模型·aigc·ai-native·moe·混合专家模型
珠海西格电力6 小时前
零碳园区边缘计算节点规划:数字底座的硬件部署与能耗控制方案
运维·人工智能·物联网·能源·边缘计算
臼犀6 小时前
孩子,那不是说明书,那是祈祷文
人工智能·程序员·markdown
黑客思维者6 小时前
《关于深入实施 “人工智能 +“ 行动的意见》深度解读
人工智能
Sui_Network6 小时前
Mysten Labs 与不丹王国政府的创新与技术部携手探索离线区块链
大数据·人工智能·web3·去中心化·区块链
互联科技报6 小时前
GEO优化工具、AI搜索引擎优化软件平台实测报告:四大平台深度体验与选型指南
大数据·人工智能·搜索引擎