Hilbert-Huang Transform: matlab 希尔伯特-黄变换: matlab实现
关于Hilbert-Huang的matlab实现,材料汇总,比较杂...感谢所有网络上的贡献者们:)
核心:以下代码计算HHT边际谱及其对应频率
工具包要求:G-Rilling EMD Toolbox,TFTB Toolbox
附:黄锷先生课题组开发的工具包(可以在 这里 找到),这里并未用到。
% Empirical mode decomposition, resulting in intrinc mode functions.
% Without parameter 'MAXMODES' the process may be seriously delayed by
% decompose original signals into too many IMFs (not necessary, 9 is
% enough generally)
imfs = emd(oriSig, 'MAXMODES', 9);
% HHT spectrum: hhtS
[A, f, t] = hhspectrum(imfs);
[hhtS, ~, fCent] = toimage(A, f, t);
% Marginal hilbert spectrum: hhtMS, xf: correspondig frequency
for k = 1 : size(hhtS, 1)
hhtMS(k) = sum(hhtS(k, : )) * 1 / fs;
end
xf = fCent(1, :) .* fs;
G-Rilling EMD Toolbox工具包相关配置:了凡春秋
简单来说,设置好路径之后输入 install_emd 即可。
Matlab关于EMD分解后希尔伯特谱分析(相关函数均隶属 G-Rilling EMD Toolbox)
- hhspectrum 函数说明(8楼:老老的学生)
% [A,f,tt] = HHSPECTRUM(imf,t,l,aff)
% Input:
%- imf : matrix with one IMF per row % 将emd分解得到的IMF代入就可以,就是你的程序中写的c变量,不用加最后一行的趋势项
%- t : time instants % 瞬时时间或持续时间 ??(写[1:信号长度]就可以,真实的时间可以根据采样率转换
%- l : estimation parameter for instfreq % 瞬时频率的估计参数 ??(写1就可以,决定瞬时频率估计时的边界从第几个点开始
%- aff : if 1, displays the computation evolution % 显示计算进程选项,不想显示写0就可以
%
% Output:
% - A : amplitudes of IMF rows
% - f : instantaneous frequencies
% - tt : truncated time instants % 截止时间 ??(截断时间,返回的是瞬时频率对应的时间,要比原来信号的时间按短,由前面的l值决定)
%
% calls:
% - hilbert : computes the analytic signal
% - instfreq : computes the instantaneous frequency % 瞬时频率
%
% Example:
[A,f,tt] = hhspectrum(c(1:end-1,:),[1:n],1,0);
[im,tt,ff] = toimage(A,f,tt,512);
disp_hhs(im,tt,[],fs);
- 9楼:老老的学生
关于时频图的概念,我认为是与诸如小波,gabor等联合时频分析方法联系在一起的。
小波,gabor等具有多尺度分析的概念,得到的时频分布是一个二维的矩阵(横轴时间,纵轴频率,可以用不同的颜色(光谱图spectrogram)或瀑布图表示不同的幅度)。
对HHT来讲,我觉得气时频图的概念是有些不同的。EMD分解的作用就是把复杂的信号分界为简单的单分量的信号,使其可以应用瞬时频率的概念,hilbert变换的目的就是分析出瞬时频率。所以HHT在每一时刻得到的只有一个值,而不是像小波之类的得到一系列的值(多尺度分析)。所以我们从其时频分布图上看到的是一条线,而不是一幅图。
- 27楼:songzy41
HHT的重要意义是通过EMD分解后得到IMP,用IMP做hilbert,对每个固有模态函数才有瞬时信息。原信号是有许多固有模态函数之和,所有原信号没有瞬时信息可言。这是HHT的基本出发点。
基于G-Rilling EMD Toolbox的Hilbert谱计算示例代码:nike815
%示例程序
N=1000;
n=1:N;
fs=1000;
t=n/fs;
fx=50;
fy=150;
x=2*sin(2*pi*fx*t);
y=sin(2*pi*fy*t);
z=x+y;
data=z;
imf=emd(data); % 对输入信号进行EMD分解
[A,f,t]=hhspectrum(imf); % 对IMF分量求取瞬时频率与振幅:A:是每个IMF的振幅向量,f:每个IMF对应的瞬时频率,t:时间序列号
[E,t,Cenf]=toimage(A,f); % 将每个IMF信号合成求取Hilbert谱,E:对应的振幅值,Cenf:每个网格对应的中心频率。这里横轴为时间,纵轴为频率。即时频图(用颜色表示第三维值的大小)和三维图(三维坐标系:时间,中心频率,振幅)
cemd_visu(data,1:length(data),imf); % 显示每个IMF分量及残余信号
disp_hhs(E); % 希尔伯特谱
% 画出边际谱
colormap(flipud(gray)); % 黑白显示
%N=length(Cenf); % 设置频率点数。完全从理论公式出发。网格化后中心频率很重要,大家从连续数据变为离散的角度去思考,相信应该很容易理解
for k=1:size(E,1)
bjp(k)=sum(E(k,:))*1/fs;
end
figure(3);
plot(Cenf(1,:)*fs,bjp); % 作边际谱图 进行求取Hilbert谱时频率已经被抽样成具有一定窗长的离散频率,所以此时的频率轴已经是中心频率
xlabel('频率 / Hz');
ylabel('幅值');
% 绘制瞬时包络图和瞬时频率图
figure;
subplot(221),plot(t/N,A(1,:));xlabel('时间 t/s');ylabel('幅值');title('imf1分量瞬时包络');
subplot(222),plot(t/N,f(1,:)*fs);xlabel('时间 t/s');ylabel('频率');title('imf1分量瞬时频率');
subplot(223),plot(t/N,A(2,:));xlabel('时间 t/s');ylabel('幅值');title('imf2分量瞬时包络');
subplot(224),plot(t/N,f(2,:)*fs);xlabel('时间 t/s');ylabel('频率');title('imf2分量瞬时频率');
Hilbert变换-Hilbert谱、Hilbert边际谱和包络谱:于青民
Hilbert谱:信号的希尔伯特变换后做fft,表示信号幅值在整个频率段上随时间和频率的变化规律;
Hilbert边际谱:对hilbert谱做积分,表示信号幅值在整个频率段上随频率的变化情况,它相当于傅里叶谱,但比傅里叶谱具有更高的频率分辨率。Hilbert边际谱是通过对Hilbert谱(在时间上)积分得到的;
Hilbert包络谱:希尔伯特变换后做包络后再fft,不同于Hilbert谱和Hilbert边际谱,是直接对信号进行Hilbert变换后构造解析函数,然后依据解析函数求模值,求的模值即为包络,然后对信号包络进行FFT后得到的即为Hilbert包络谱。
学习笔记:rogen
边际谱从统计意义上表示了整组数据每个频率点的积累幅值分布,而傅立叶谱的某点幅值表示在整个信号里有一个含有此频率的三角函数组分,而且幅值越大只是说明在整个数据段上,局部存在的可能性越大。
再看得到的图形,FFT 表示的是整个数据中,能量在一个频率上分布的可能性地描述,而边际谱表示在在每一个频率上幅值的积累,如果想知道具体时间那么就看HHT谱,这个时间-幅值-频率的三维谱。说到瞬时频率,傅立叶变换不强调局部性,而是强调全局性。咱们的HHT才提出一个唯一的瞬时频率的定义。因此拿瞬时频率来衡量傅立叶变换也是不公平的。
对于边际谱,就是hilbert谱对时间的积分,从积分的角度来讲,就相当于对任意一阶频率把所有的时间上的幅值都加起来了,这就反映这阶频率在所有时间上的幅值积累,而对于他们对于频率所对应的幅值,描述为该频率在整个时间上出现的可能,我个人认为是既然出现了,那就是存在的,不能说是一种可能,只能说他出现的次数的多少,经过累积以后就变成了他的幅值,而对于fourier来讲,他只能说明在用正余弦函数拟合这个信号的时候需要这一阶频率,幅值大,则说明他对拟合这个信号的贡献大,而不是一种出现的可能性的度量。
能量谱,可以理解为对边际谱的平方,这个只是具有能量的形式,而具体是否能代表能量,需要更进一步的探讨,还有一个瞬时能量,这些名词确实很诱人,但究竟如何,还需要大家的努力。
另一个比较详细的HHT资料,附matlab代码:cwjy
- 边际谱与傅里叶谱的比较
意义不同:边际谱从统计意义上表征了整组数据每个频率点的累积幅值分布,而傅里叶频谱的某一点频率上的幅值表示在整个信号里有一个含有此频率的三角函数组分。
作用不同:边际谱可以处理非平稳信号,如果信号中存在某一频率的能量出现,就表示一定有该频率的振动波出现,也就是说,边际谱能比较准确地反映信号的实际频率成分。而傅里叶变换只能处理平稳信号。 - HHT & Hilbert变换
Hilbert变换只是单纯地求信号的瞬时振幅,频率和相位,有可能出现没有意义的负频率;HHT变换先将信号进行EMD分解,得到的是各个不同尺度的分量,对每一个分量进行Hilbert变换后得到的是有实际意义的瞬时频率。
Hilbert-Huang Transform: matlab 希尔伯特-黄变换: matlab实现的更多相关文章
- Hilbert-Huang Transform(希尔伯特-黄变换)
在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...
- Matlab实现Hough变换检測图像中的直线
Hough变换的原理: 将图像从图像空间变换至參数空间.变换公式例如以下: 变换以后,图像空间与參数空间存在下面关系: 图像空间中的一点在參数空间是一条曲线,而图像空间共线的各点相应于參数空间交于一点 ...
- Matlab实现Hough变换检测图像中的直线 分类: 图像处理 2014-06-14 22:07 641人阅读 评论(0) 收藏
Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各 ...
- 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...
- [python][matlab]使用python调用matlab程序
问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划 ...
- 面向对象:MATLAB的自定义类 [MATLAB]
https://www.cnblogs.com/gentle-min-601/p/9785812.html 面向对象:MATLAB的自定义类 [MATLAB] 这几天刚刚开始学习MATLAB的面向 ...
- MATLAB工具包——curvelet变换的理解(转)
curvelet下载的curvelet工具包,有以下三个文件:fdct_usfft_matlab.fdct_wrapping_matlab.mecv三个文件夹添加到matlab路径中即可. curve ...
- MATLAB与三大变换
运行 Simulink 有三种方式: z 在 MATLAB 的命令窗口直接键入“Simulink”并回车: z 单击 MATLAB 工具条上的 Simulink 图标: z 在 MATLAB 菜单上选 ...
- Radon变换——MATLAB
算法说明: 图像的Radon变换是每个像素的Radon变换的总和. 该算法首先将图像中的像素分成四个子像素,并分别投影每个子像素,如下图所示. 根据投影位置和箱体中心之间的距离,每个子像素的贡献按比例 ...
随机推荐
- android事件分发机制
android事件分发机制,给控件设置ontouch监听事件,当ontouch返回true时,他就不会走onTouchEvent方法,要想走onTouchEvent方法只需要返回ontouch返回fa ...
- java中实现线程同步
为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他 ...
- 安卓下如何使用JUnit进行软件测试
软件测试作为程序员必备的一项技能是决定软件开发周期长短以及软件运行成败的关键,可以说好的软件不是代码写得好而是有效的测试决定的.本文将介绍在android下利用eclipse进行开发时如何使用JUni ...
- 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
- SSRS报表连接超时的问题
这段时间遇到一个问题就是ReportService 中采用了远程连接的报表偶尔会断开连接,导致报表导出异常,查阅了很多资料,几天来就是断断续续的终于解决了这个问题,下面把一些解决的点一一展示出来,便于 ...
- 使用SQL检测死锁
第一步:首先创建两个测试表,表goods_sort和goods 表goods_sort:创建并写入测试数据 IF EXISTS(SELECT name FROM sysobjects WHERE na ...
- MySQL创建索引语法
1.介绍: 所有mysql索引列类型都可以被索引,对来相关类使用索引可以提高select查询性能,根据mysql索引数,可以是最大索引与最小索引,每种存储引擎对每个表的至少支持16的索引.总索引长度为 ...
- Linux多进程编程
进程的状态 Linux进程有7种基础状态(两种running算一种),除了traced都可以用$ps命令查看,$ps可以查看的进程状态如下,更多进程状态信息参见Linux Process VS Thr ...
- linux中send函数MSG_NOSIGNAL异常消息
最近2周在做ineedle的国舜项目扩展,需要使用socket的tcp连接向对方发送消息,当然需求很简单,只是按照对方要求发送指定格式的消息,程序结构也非常的简单,一对多的client/server模 ...
- 56相册视频(土豆相册视频 激动相册视频 QQ动感影集等)——下载教程
由于目前流行的相册视频或影集大多是由Flash.音乐和图片组合而成的动画,不属于完整视频,所以不能用常规的解析方法下载. 鉴于很多朋友希望可以下载自己精心制作的相册,故在本教程中,我们将以图文并茂的方 ...