关于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. Android Sqlite基本命令

    要查看数据库,首先必须要找到db文件,如果拷贝到电脑上,查看的方法比较多,在手机上,用命令查看比较直接和方便. 首先要找到数据库的位置,一般数据库时存放在程序的私有目录,所以要获取root权限. 确保 ...

  2. 【Android自定义控件】支持多层嵌套RadioButton的RadioGroup

    前言 非常喜欢用RadioButton+RadioGroup做Tabs,能自动处理选中等效果,但是自带的RadioGroup不支持嵌套RadioButton(从源码可看出仅仅是判断子控件是不是Radi ...

  3. intelliJ idea代码折叠

    在intelliJ idea中不仅可以对类.方法等结构的代码进行折叠(ctrl+-)还可以自定义折叠代码.intelliJ支持两种风格的自定义代码折叠,如下: visual studio style ...

  4. C#复习④

    C#复习④ 2016年6月16日 12:37 Main Classes and Structs 类和结构体 1.Contents of Classes 字段,常量,方法,构造函数,析构函数: 特性,事 ...

  5. visual studio生成后调试启动又提示部分项目需要生成问题总结

    长久以来若干个项目都遇到过类似的情形,已经成功生成的项目启动调试或者再生成依然认为部分项目需要生成而不是跳过.总结以往的经验,记录下来,以便大家遇到时处理. 若有多个项目提示需要重新生成,优先检查被依 ...

  6. JavaScript Patterns 5.1 Namespace Pattern

    global namespace object // global object var MYAPP = {}; // constructors MYAPP.Parent = function() { ...

  7. Bigfish的重新安装

    昨天把ofbiz安装并成功运行起来,今天接着再把bigfish下载下来. 上次安装配置bigfish时,记得是费了一番周折的,最后也不知道怎么瞎折腾,最终居然跑起来了. 今天有意识整理了下关键步骤,记 ...

  8. Apache安装问题:configure: error: APR not found . Please read the documentation

    Linux上安装Apache时,编译出现错误: checking for APR... no configure: error: APR not found .  Please read the do ...

  9. DateTime的精度小问题

    一般来说判断时间的话,用个DateTime类型就已经够用了.但是有些情况,比如下面这种 DECLARE @DT1 DATETIME DECLARE @DT2 DATETIME SELECT @DT1 ...

  10. 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...