发新话题
打印

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

请教:disp_hhs中的fs=0?

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

TOP

当我注释掉if选择直接用eles的条件时,显示的是一个图象框,有坐标和轴说明和刻度但是没有图谱。

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

谢谢帮忙~

TOP

回复 楼主 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
从而绘制对应实际采样率的谱图。

TOP

调用disp_hhs时没有fs参数,这时就是fs=0,程序就用归一化的频率。

TOP

万分感谢!

谢谢Xray和mingtiangenghao的解释和指点,明白了,真是太感谢了,谢谢~

TOP

新疑惑

对了,小妹还有一问题,请求指教:也是在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

TOP

附加:

尤其是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);


查了好久也不知道原因 请朋友们指教,帮帮忙

TOP

发新话题