关于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实现的更多相关文章

  1. Hilbert-Huang Transform(希尔伯特-黄变换)

    在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...

  2. Matlab实现Hough变换检測图像中的直线

    Hough变换的原理: 将图像从图像空间变换至參数空间.变换公式例如以下: 变换以后,图像空间与參数空间存在下面关系: 图像空间中的一点在參数空间是一条曲线,而图像空间共线的各点相应于參数空间交于一点 ...

  3. Matlab实现Hough变换检测图像中的直线 分类: 图像处理 2014-06-14 22:07 641人阅读 评论(0) 收藏

    Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各 ...

  4. 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  5. [python][matlab]使用python调用matlab程序

    问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划 ...

  6. 面向对象:MATLAB的自定义类 [MATLAB]

    https://www.cnblogs.com/gentle-min-601/p/9785812.html 面向对象:MATLAB的自定义类 [MATLAB]   这几天刚刚开始学习MATLAB的面向 ...

  7. MATLAB工具包——curvelet变换的理解(转)

    curvelet下载的curvelet工具包,有以下三个文件:fdct_usfft_matlab.fdct_wrapping_matlab.mecv三个文件夹添加到matlab路径中即可. curve ...

  8. MATLAB与三大变换

    运行 Simulink 有三种方式: z 在 MATLAB 的命令窗口直接键入“Simulink”并回车: z 单击 MATLAB 工具条上的 Simulink 图标: z 在 MATLAB 菜单上选 ...

  9. Radon变换——MATLAB

    算法说明: 图像的Radon变换是每个像素的Radon变换的总和. 该算法首先将图像中的像素分成四个子像素,并分别投影每个子像素,如下图所示. 根据投影位置和箱体中心之间的距离,每个子像素的贡献按比例 ...

随机推荐

  1. IOS contentOffset该如何理解

    contentOffset是哪个点??? 首先从字面理解:内容偏移 我可是查了词典的!!! 对于contentOffset有的时候我们会产生错误理解. 我不想在这里介绍错误的理解避免不必要的混淆. 我 ...

  2. jQuery删除节点和追加节点

    for (var i in checkedBoxIds) { var $td = $("#" + checkedBoxIds[i]).parent().parent().detac ...

  3. Log4jConfigListener cannot be found — context fails to start

    解决方案 Reticulogic's second suggestion is correct. However, in Eclipse Helios, the "Java EE Modul ...

  4. Hierarchyid 常用操作

        ---------内置函数------------ select hierarchyid::GetRoot()--0x select hierarchyid::Parse('/1/1/') - ...

  5. 未能正确加载 ”Microsoft.VisualStudio.Editor.Implementation.EditorPackate“包错误解决方法

    今天新来一个同事,帮他搭建开发环境.发现他的vs2012一打开就报错. 错误提示: 未能正确加载 "Microsoft.VisualStudio.Editor.Implementation. ...

  6. Harrypotter

    #include<iostream> using namespace std; int main() { ]={}; int a,b,c,d; cout<<"请输入总 ...

  7. VS 2013中的新特性browser link

    Browser Link是连接VS和浏览器之间的通道.有了这个特性,web程序就能够和VS交互传递数据.这个特性在VS2013中是默认开启的.当开启了Browser Link, web程序运行的时候, ...

  8. 好久没有写博客了,发现Live Writer也更新了

    最近由于工作变动,工作内容和心态也有所变化,所以很久没有写博客了,而且我的开源项目深蓝词库转换也很近没有更新了.今天打开LiveWriter发现居然有新版本,于是果断更新.现在新的LiveWriter ...

  9. Java synchronized同步 各方式略解

    近段为了实现一个功能,在树结构中,修改某个节点名称时,需要同时修改这个节点所有子节点的节点全路径属性字段(类似"父父节点名称/父节点名称/子节点名称/子子节点名称"的构造).因为在 ...

  10. Mysql数据库的通用安装方法

    安装方式简介 Mysql数据库也时不时的用过一段时间,具体使用的功能都比较浅显,没有具体深入学习.最近一段在公司部署iNeedle系统时经常避免不了要安装apache和Mysql数据库.一般Mysql ...