phase函数和angle函数有什么区别

如题所述

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

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

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

下面举例说明。

Example 1: 1维向量
g = [-1-1i -1+1i]; % 对应角度为 -3*pi/4 (=-2.3562) 和 3*pi/4 (=-2.3562)
ang = angle(g)
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维矩阵
g = [-1-1i -1+1i; -1-1i -1+1i];
ang = angle(g)
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
function p = angle(h)
%ANGLE Phase angle.
% ANGLE(H) returns the phase angles, in radians, of a matrix with
% complex elements.
%
% Class support for input X:
% float: double, single
%
% See also ABS, UNWRAP.

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

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

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

%PHI = unwrap(angle(G));
[nr,nc] = size(G);
if min(nr,nc) > 1
error(sprintf(['PHASE applies only to row or column vectors.'...
'\nFor matrices you have to decide along which dimension the'...
'\nphase should be continuous.']))
end
if nr>nc
G = G.';
end
PHI=atan2(imag(G),real(G));
N=length(PHI);
DF=PHI(1:N-1)-PHI(2:N);
I=find(abs(DF)>3.5);
for i=I
if i~=0,
PHI=PHI+2*pi*sign(DF(i))*[zeros(1,i) ones(1,N-i)];
end
end
if nr>nc
PHI = PHI.';
end
温馨提示:答案为网友推荐,仅供参考
相似回答