news 2026/5/4 8:59:47

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
希尔伯特-黄变换(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=[40160]/(Fs/2);% 通带边界ws=[30170]/(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));fori=1:size(imf,1)analytic{i}=hilbert(imf(i,:));% 构造解析信号end%% 瞬时频率与幅值计算[inst_amp,inst_phase]=deal(zeros(size(imf)));fori=1:size(imf,1)phase=angle(analytic{i});inst_phase(:,i)=unwrap(phase);% 相位解包裹inst_amp(:,i)=abs(analytic{i});% 瞬时幅值endinst_freq=zeros(size(imf));fori=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));fori=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分解函数(增强版)
functionimfs=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;whiletrue 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;% 筛选IMFimf_candidate=residual-mean_env;% IMF条件验证ifis_imf(imf_candidate,p.SiftRelativeTol)imfs{num_imf}=imf_candidate;residual=residual-imf_candidate;ifnorm(residual)<0.1*norm(signal)break;endelseresidual=imf_candidate;end% 显示进度ifp.Displayfprintf('IMF%d: 残差能量比=%.4f\n',num_imf,norm(residual)/norm(signal));endendendfunction[max_peaks,min_peaks]=find_extrema(x)% 极值点检测n=length(x);max_peaks=[];min_peaks=[];fori=2:n-1ifx(i)>x(i-1)&&x(i)>x(i+1)max_peaks=[max_peaks;i,x(i)];elseifx(i)<x(i-1)&&x(i)<x(i+1)min_peaks=[min_peaks;i,x(i)];endendendfunctionis_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

三、核心参数优化
参数推荐值作用说明
MaxNumIMF5-10控制分解深度与计算量
SiftRelativeTol0.1-0.3分解精度控制
Display1 (True)显示分解过程
滤波器类型Chebyshev II高频噪声抑制

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

四、工程应用扩展
1. 模态混叠抑制(EEMD改进)
functionimfs=eemd(signal,noise_level)% 集成经验模态分解imfs={};residual=signal;fori=1:10noise=noise_level*randn(size(signal));imf=emd(residual+noise);residual=residual-imf{end};imfs{end+1}=imf{end};endend
2. 边界效应处理(镜像延拓)
functionx_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)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 2:01:04

基于Kubo公式的石墨烯电导率与表面阻抗计算(MATLAB实现)

一、理论基础 石墨烯的电导率可通过Kubo公式计算&#xff0c;包含Drude电导率&#xff08;自由载流子贡献&#xff09;和带间跃迁电导率&#xff08;量子干涉贡献&#xff09;。表面阻抗则由电导率导出&#xff0c;反映电磁波在石墨烯表面的反射/透射特性。 1. Kubo公式核心表达…

作者头像 李华
网站建设 2026/5/1 10:11:23

BES平台(恒玄) ANC调试笔记

一 前言 最近比较忙,昨天更新了EQ 调试模块,今天就趁热打铁把ANC部分也写下。 主要说一些基于恒玄平台2500的ANC 环境搭配 软件设置 和 常见问题分析,个人见解,有不足之处,敬请锤教。 二 环境搭配 (此处引用BES 原厂ANC调试指南) 确保腔体的密闭性,前后腔部分需要用…

作者头像 李华
网站建设 2026/5/2 19:28:33

FreeRtos中I2C操作过程中被任务切换或者中断打断会不会出问题

疑问&#xff1a;一直有个疑问就是一些外设的驱动需不需要加临界区&#xff0c;比如i2c&#xff0c;我要写操作&#xff0c;要操作片选&#xff0c;写寄存器地址&#xff0c;写入数据&#xff0c;再操作片选。不加的话在写的中间有别的中断打断导致时序会不会出问题答&#xff…

作者头像 李华
网站建设 2026/5/1 8:17:04

前端——单元测试实践

背景问题&#xff1a; 需要为 Vue3 Vite 项目编写单元测试。 方案思考&#xff1a; 使用 Vitest 作为测试框架&#xff0c;结合 vue/test-utils 进行组件测试。 具体实现&#xff1a; 安装测试依赖&#xff1a; # 安装 Vitest 和 Vue 测试工具 npm install -D vitest vue/test…

作者头像 李华
网站建设 2026/5/1 12:58:52

Vue 3 中的具名插槽仍然完全支持,Vue 2 的旧语法 Vue 3 中已废弃

Vue3中具名插槽的使用方式更加统一和简洁。新版本采用v-slot指令&#xff08;简写为#&#xff09;替代Vue2的slot和slot-scope属性&#xff0c;支持默认插槽、具名插槽和作用域插槽。子组件通过name属性定义插槽&#xff0c;父组件使用#插槽名语法插入内容。Vue3还增强了动态插…

作者头像 李华
网站建设 2026/5/1 17:29:53

Roots.ai团队推出GutenOCR:让AI既能读字又能精准定位

这项由Roots.ai团队开展的研究发表于2026年1月的arXiv预印本服务器&#xff0c;论文编号为arXiv:2601.14490v1。有兴趣深入了解技术细节的读者可以通过该编号查询完整论文。 当你用手机扫描一份文件时&#xff0c;是否曾经遇到过这样的困扰&#xff1a;软件能够识别出文字内容&…

作者头像 李华