声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4103|回复: 13

[HHT] 请教:disp_hhs中的fs=0?

[复制链接]
发表于 2008-8-28 21:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我分析的谱出来的总是纵坐标显示为“nomolized frequently”,查看程序发现,有个if语句,但是追溯到前面看到在disp-hhs起始时有个fs=0设定,连同下面的if条件,没太看明白,请求高手给解释一下,小妹在此万分感谢啦~:@)
回复
分享到:

使用道具 举报

 楼主| 发表于 2008-8-28 22:00 | 显示全部楼层
当我注释掉if选择直接用eles的条件时,显示的是一个图象框,有坐标和轴说明和刻度但是没有图谱。

请问高手是什么地方出现了问题?

谢谢帮忙~
发表于 2008-8-29 08:53 | 显示全部楼层

回复 楼主 fgsunny 的帖子

在disp_hhs.m中,第27行的 fs=0 是默认的情况,仔细分析如下语句
if fs == 0
  imagesc(t,[0,0.5],im,[inf,0]);
  ylabel('normalized frequency')
else
  imagesc(t,[0,0.5*fs],im,[inf,0]);
  ylabel('frequency')
end
可以发现:当满足条件 fs=0 时执行的语句 imagesc(t,[0,0.5],im,[inf,0]);
相当于 imagesc(t,[0,0.5*1],im,[inf,0]); 也就是说,此时fs默认为1,
这也就是所谓归一化频率的含义。因此,严格的说,在第27行,
改为 fs=1 才比较准确,相应的条件判断应该改为  if fs == 1 。

但是,实际上绘图的时候,有时候希望采用实际的采样率,因此作者提供了
disp_hhs(im,inf,fs) ; disp_hhs(im,[],fs)
disp_hhs(im,t,[],fs) ; disp_hhs(im,t,inf,fs)
这四种方式支持带fs输入的调用方式。
同时,在程序中,采用如下代码处理fs
switch nargin
  case 1
    %raf
  case 2
    if isscalar(varargin{2})
      inf = varargin{2};
    else
      t = varargin{2};
    end
  case 3
    if isvector(varargin{2})
      t = varargin{2};
      inf = varargin{3};
    else
      inf = varargin{2};
      fs = varargin{3};
    end
  case 4
    t = varargin{2};
    inf = varargin{3};
    fs = varargin{4};
end
其中nargin和varargin是matlab用来处理变长参数的方法,相当于C语言中的argc和argv,前者记录输入变量的个数,后者保存输入变量的值。可以看出,当输入参数为3个或者4个的时候,fs被重新赋值,也就等于了实际输入的采样率。此时,后面绘图中调用的语句就是
else
  imagesc(t,[0,0.5*fs],im,[inf,0]);
  ylabel('frequency')
end
从而绘制对应实际采样率的谱图。
发表于 2008-8-29 16:48 | 显示全部楼层
调用disp_hhs时没有fs参数,这时就是fs=0,程序就用归一化的频率。
 楼主| 发表于 2008-8-31 09:20 | 显示全部楼层

万分感谢!

谢谢Xray和mingtiangenghao的解释和指点,明白了,真是太感谢了,谢谢~:@)
 楼主| 发表于 2008-8-31 10:40 | 显示全部楼层

新疑惑

对了,小妹还有一问题,请求指教:也是在disp -hhs中的下面是判断的是什么?
if isempty(inf)
  inf = -20;
end
if inf > 0
  inf = -inf;
elseif inf == 0
  error('inf must be nonzero')
end
M=max(max(im));
warning off
im = 10*log10(im/M);
warning on
 楼主| 发表于 2008-8-31 10:42 | 显示全部楼层

附加:

尤其是if isempty(inf)

im = 10*log10(im/M);
我的程序运行是总是显示这样的错误:
?? Error using ==> unknown
Out of memory. Type HELP MEMORY for your options.
Error in ==> disp_hhs at 67
im = 10*log10(im/M);
Error in ==> MethiumDataTest_6_HHT at 172
   disp_hhs(im);


查了好久也不知道原因:'( 请朋友们指教,帮帮忙
发表于 2010-10-18 10:59 | 显示全部楼层
isempty(inf)
是判断inf是不是为空矩阵
发表于 2010-10-19 19:54 | 显示全部楼层
。。。。
发表于 2012-4-3 20:04 | 显示全部楼层
发表于 2012-9-17 19:32 | 显示全部楼层
disp_hhs(E)
横坐标时间是采样的时间点的个数,,纵坐标频率显示的是归一化频率范围是【0,0.5】,而不是实际的频率,请问大家,如何使做出来的谱图频率显示的是实际频率呢??谢谢了!!
发表于 2012-9-17 19:45 | 显示全部楼层
我知道怎么弄了,把disp_hhs函数里的这一行代码 : imagesc(t,[0,0.5],im,[inf,0]);
改为:  imagesc(t,[0,0.5*fs],im,[inf,0]);这样得到的谱图就是真实频率而不是归一化频率
发表于 2014-9-4 19:37 | 显示全部楼层
石头王石头 发表于 2012-9-17 19:45
我知道怎么弄了,把disp_hhs函数里的这一行代码 : imagesc(t,[0,0.5],im,);
改为:  imagesc(t,[0,0.5*fs ...

disp_hhs(E,[],fs);这样比较保守一些,不用改原函数了。。。
发表于 2014-9-17 20:42 | 显示全部楼层
fgsunny 发表于 2008-8-31 10:42
尤其是if isempty(inf)

im = 10*log10(im/M);

请问这个问题怎么解决的呢 我也碰到了这个问题 束手无策
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-28 20:02 , Processed in 0.080643 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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