声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

楼主: zhoupingwoo

[HHT] Hilbert边际谱程序(matlab)

  [复制链接]
发表于 2014-6-26 13:45 | 显示全部楼层
回复 支持 反对
分享到:

使用道具 举报

发表于 2014-6-27 07:12 | 显示全部楼层
请问[A,fa,tt]、[E,tt1]中符号各是什么意思?
发表于 2014-9-2 22:11 | 显示全部楼层
破凰 发表于 2007-6-12 17:51
是N-3,用hhspectrum求瞬时频率和瞬时幅值后,就少了两个数据,所以应是f=(0:N-3)/N*fs/2

为什么会少两个数据呀?具体少的是哪两个数据,可以解释一下吗,谢谢!
发表于 2014-9-2 22:20 | 显示全部楼层
吃书的老虎 发表于 2007-6-15 21:23
要求边际谱,首先要对各阶IMF作Hilbert变换,求得幅值。对相同的频率,其幅值求和。虽然在同一时间点,其频 ...

比如我有12个IMF分量,利用这12个IMF分量得出的瞬时频率也分成12个数组IF,而且长度会比IMF小1,同时得到12个瞬时幅度数组IA;接下来是要把IF中的所有频率进行重排吗?排完之后,再将对应的瞬时幅度加起来乘以采样时间就得到边际谱了吗?不知道我说明白了没有,,我有点糊涂,就是怎么重排瞬时频率并且对应的瞬时幅值也重排,如果你有程序,可以共享一下吗,谢谢啦!!!
发表于 2014-9-2 22:41 | 显示全部楼层
clanna 发表于 2009-12-28 20:24
你的那个为什么乘以fs,有没有找到答案呢,为什么啊,我很不明白,为什么是对toimage的每一行进行求和?麻 ...

你的这个问题解决了吗?可以分享一下吗?我也想不通这个,是不是要看懂Ttoimage这个函数才能理解这个呀,我不明白%TOIMAGE  transforms a spectrum made of 1D functions in an 2D image 是什么意思。。。是把所有的IMF分量转化成一幅2维图片?
发表于 2014-9-2 22:47 | 显示全部楼层
linqus 发表于 2010-10-24 00:20
其实你将前面的N=1000去掉,
在求边际谱前用N=size(E,1)
就要用f=(0:N-1)/N*(fs/2);了

效果是一样的吧?
发表于 2014-9-2 22:51 | 显示全部楼层
cboboc 发表于 2011-5-13 08:55
破凰的边际谱中为什么要乘以1/fs呢?直接将每一个频率值对应的整个时间上的幅值相加不对吗?

我也觉得是直接将每一个频率值对应的整个时间上的幅值相加,但是没有动手实现过,因为我觉得如果这样做的话,是不是要知道每个IMF分量里到底含有多少个频率成分,而且还要知道某个频率成分所对应的瞬时幅度,这个怎么实现呀。。。
发表于 2014-9-3 17:19 | 显示全部楼层
cwb 发表于 2014-9-2 22:20
比如我有12个IMF分量,利用这12个IMF分量得出的瞬时频率也分成12个数组IF,而且长度会比IMF小1,同时得到1 ...

你的理解是对的,实际就是对瞬时频率重新排序,瞬时幅值也随瞬时频率排序改变而对应变化。http://perso.ens-lyon.fr/patrick.flandrin/emd.html;这个网站有编写好的程序。你可以参考
发表于 2014-9-3 23:00 | 显示全部楼层
吃书的老虎 发表于 2014-9-3 17:19
你的理解是对的,实际就是对瞬时频率重新排序,瞬时幅值也随瞬时频率排序改变而对应变化。http://perso.e ...

嗯,这些程序我都有,我有三个版本的程序:National Taiwan Central University, Matlab File Exchange Center,和G Rilling(2007版)的。我试过了后两个版本:Matlab File Exchange Center是分解出IMF,然后画出 时间-频率图,而幅度好像是用灰度(我不确定)表示的,没有给出画幅度-频率-时间三维图的画法,也没有给出边际谱的画法;而G rilling的程序也是一样,我在论坛上看到的画A-f-t谱图和边际谱图的的方法是:
>> x=xlsread('matlab');
>> y=x(:,2);
>> imf=emd(y);
>>[A,fa,tt]=hhspectrum(imf);
>> [E,tt1]=toimage(A,fa,tt,length(tt));
>> disp_hhs(E,tt1) %画Hilbert-Huang spectrum
>>fs=500000;%采样频率500kHz
>> for k=1:size(E,1)
bjp(k)=sum(E(k,:))*1/fs;
end
>>f=(0:(length(y)-3))/(length(y))*(fs/2);%频率
>>plot(f,bjp); %画边际谱
其实我不理解为什么按照上面求得的bjp(k)=sum(E(k,:))*1/fs;就是边际谱?难道函数toimage的功能就是排序吗?在这里,我的数据y是9000个点,得到的E是8998*8998的矩阵,难道E的每一行就代表同一个瞬时频率下的8998个瞬时幅值吗?
还有一个问题,有解释说边际谱的纵轴并不是实际幅值,而是代表某个频率出现的概率的大小,如果是这样的话,sum(bjp)是否应该等于1呀?可是我求得的值是sum(bjp)=0.0034,完全不等于1嘛,晕掉了。。。


还有,你看我用下面的程序求瞬时幅度-时间谱和瞬时频率-时间谱可以吗?
igure;
  for k=1:length(imf) %幅度-时间谱
        plot(tt,A(k,:));
        hold on;
  end
figure;
  for k=1:length(imf) %频率-时间谱
        plot(tt,fa(k,:));
        hold on;
  end
实际上就是把所有的瞬时幅度叠加在一张图上,把所有的瞬时频率叠加在另一张图上,这涉及到我对Hilbert-Huang Spectrum的理解,我不知道对不对。

另外,我试图用disp_hhs(E,tt1)画图时,出现错误了,??? Out of memory. Type HELP MEMORY for your options.
Error in ==> disp_hhs at 67
im = 10*log10(im/M);
你知道是什么意思吗?很奇怪,好像和调用toimage时的参数length(tt)有关,如果我去掉参数length(tt),运行[E,tt1]=toimage(A,fa,tt,);之后再运行disp_hhs(E,tt1)就可以出图,但这个时候的E变成400*8998的矩阵了。。。如果要完整的画出Hilbert-Huang Spectrum,一定要用disp_hhs吗,这画出来的图背景是蓝色的,横坐标是时间,纵坐标是normalized frequency,那幅度怎么表示呢?

唉,不懂的太多,请你不吝赐教,等你的回复。。。谢谢了!!!
发表于 2014-9-8 09:56 | 显示全部楼层
各位大神,学习中
发表于 2014-9-11 21:05 | 显示全部楼层
form 发表于 2007-4-8 20:17
前面这是我做的,你是在hhspectrum后面加的吗?

你好,可以解释一下toiamge得到的结果中E到底是什么意思吗?它的行和列是受toiamge函数中的参数个数控制的,我一直都没搞明白为什么默认的行是400行。。。如果加上tt和length(tt)的话又出错,,,还有为什么对E的每一行进行累加得到的就是边际谱,难道E的每一行就代表某个频率在整个时间跨度上的幅度值吗?
如能得到解答,感激不尽,谢谢!!!
发表于 2014-9-16 21:32 | 显示全部楼层
Good!!!!!
发表于 2014-9-20 13:33 | 显示全部楼层
EMD的很多缺陷大多是由于使用不当造成,要仔细看下载的程序。我是初学,但是感觉到如何使用时很大的一门学问。
发表于 2014-9-24 20:33 | 显示全部楼层
学习啦,我也碰到类似问题
发表于 2014-9-30 16:10 | 显示全部楼层
破凰 发表于 2007-4-27 21:51
form求边际谱时所用程序是没有问题的,用的是矩形积分公式。
他所得结果不正确的原因是:输入的应是调用了 ...

破凰,为啥我把你的程序直接复制,得到结果不对啊,hhspectrum后的fa就不会,是0.97和0.955,最后的结果的边际谱只有第一项为6.986,其他全位0 啊?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-3 04:02 , Processed in 0.097563 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表