加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]matlab中angle和phase的区别

(2017-07-27 20:22:03)
标签:

转载

phase 和 angle 在输入为单个标量数据时,没有差别,二者都是用 atan2 函数来求输入数据的四象限辐角。但是对于向量或矩阵数据输入时,二者差别非常大。

1. phase 只支持标量和一维(行、列)向量输入,不支持二维或高维矩阵输入。angle 可以支持标量或任意维数矩阵输入

2. 对于向量输入,phase 会对输出结果做判断,如果相邻两个输出角度的差的绝对值超过 3.5,phase 会对其重新处理,确保相邻两个角度差值的绝对值永远不超过3.5。而 angle 函数对每个数据独立求其辐角,不会因为相邻角度差超出某个数值而做特殊处理。所以,从这个意义上讲,angle 函数是我们通常需要使用的求角度的函数,而 phase 的特殊处理,会导致得出与angle不同的结果。

下面举例说明。

Example 1: 1维向量
  1. g = [-1-1i -1+1i];  % 对应角度为 -3*pi/4 (=-2.3562) 和 3*pi/4 (=-2.3562)
  2. ang = angle(g)
  3. pha = phase(g)
复制代码
输出结果是:
ang =
   -2.3562    2.3562

pha =
   -2.3562   -3.9270
很显然,由于 2.3562与-2.3562的差值的绝对值超过了3.5,phase函数的处理使得得到的结果并非我们想要的,而angle函数是直接对每个输入数据求角度,不会考虑相邻两个角度的差值大小。所以,angle 求得的是我们需要的

Example 2:2维矩阵
  1. g = [-1-1i -1+1i; -1-1i -1+1i];
  2. ang = angle(g)
  3. pha = phase(g)
复制代码
输出结果是:
ang =
   -2.3562    2.3562
   -2.3562    2.3562

Error using phase (line 17)
PHASE applies only to row or column vectors.
For matrices you have to decide along which dimension the
phase should be continuous.
从这个例子可以看出,对于矩阵输入,只有angle函数能正常工作,phase函数无法支持矩阵输入。


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
综上所述,如果我们对输出角度的差值没有限制,而只是单纯的求输入数据的辐角,我们应该用 angle 函数。所以,对于楼主的代码,最好将 phase 换成 angle 函数。

最后,建议楼主用 edit angle 和 edit phase 分别打开angle和phase两个函数,看看其内部具体实现,二者的差别就一目了然了。下面给出 angle 和 phase 函数的内部源代码,楼主可以自行比较:

% angle.m
  1. function p = angle(h)
  2. %ANGLE  Phase angle.
  3.  ANGLE(H) returns the phase angles, in radians, of a matrix with
  4.  complex elements.  
  5. %
  6.  Class support for input X:
  7.     float: double, single
  8. %
  9.  See also ABS, UNWRAP.

  10.  Copyright 1984-2010 The MathWorks, Inc. 
  11.  $Revision: 5.7.4.2 $  $Date: 2010/04/21 21:31:19 $

  12. p = atan2(imag(h), real(h));
复制代码
% phase.m
  1. function PHI=phase(G)
  2. %PHASE  Computes the phase of a complex vector
  3. %
  4.  PHI=phase(G)
  5. %
  6.  G is a complex-valued row vector and PHI is returned as its
  7.  phase (in radians), with an effort made to keep it continuous
  8.  over the pi-borders.

  9.  L. Ljung 10-2-86
  10.  Copyright 1986-2004 The MathWorks, Inc.
  11.  $Revision: 1.5.4.2 $  $Date: 2004/07/31 23:24:49 $

  12. %PHI = unwrap(angle(G));
  13. [nr,nc] = size(G);
  14. if min(nr,nc) > 1
  15.     error(sprintf(['PHASE applies only to row or column vectors.'...
  16.         'nFor matrices you have to decide along which dimension the'...
  17.         'nphase should be continuous.']))
  18. end
  19. if nr>nc
  20.     G = G.';
  21. end
  22. PHI=atan2(imag(G),real(G));
  23. N=length(PHI);
  24. DF=PHI(1:N-1)-PHI(2:N);
  25. I=find(abs(DF)>3.5);
  26. for i=I
  27.     if i~=0,
  28.         PHI=PHI+2*pi*sign(DF(i))*[zeros(1,i) ones(1,N-i)];
  29.     end
  30. end
  31. if nr>nc
  32.     PHI = PHI.';
  33. end
复制代码


0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有