实数的角度()

时间:2017-02-16 04:00:11

标签: matlab angle complex-numbers phase

我对Matlab中的angle()函数有点困惑,特别是当应用于实数数组时。

angle()函数应该给我一个复数的阶段。示例:y = a + bi,==> phase = arctan(b / a)。确实,以下工作:

for t=1:1000
    comp(t) = exp(1i*(t/10));
end

phase_good_comp1 = unwrap(angle(comp)); %this gives me the right answer
b = imag(comp);
a = real(comp);
phase_good_comp2 = atan(b./a); %this gives me the right answer too, but 
wrapped (not sure if there is a way to unwrap this, but unwrap() does not 
work)

figure(1)
plot(phase_good_comp1)
hold on
plot(phase_good_comp2,'--r')
legend('good phase1', 'good phase2')
title('complex number')

这是复数的图 -

enter image description here

请注意,我可以使用angle()函数或阶段的显式定义,如上所示。两者都产生了良好的效果(我无法打开后者,但这不是我的问题)。

现在,如果我将相同的逻辑应用于实数数组,我应该在任何地方得到一个恒定的阶段,因为没有虚部,所以arctan(b / a)= arctan(0)= 0.如果我有效使用阶段的显式定义,但如果我使用angle():

,我会得到一个奇怪的结果
for t=1:1000
    ree(t) = cos((t/10));
end

phase_bad_re = unwrap(angle(ree)); %this gives me an unreasonable (?) answer
b = imag(ree);
a = real(ree);
phase_good_re = atan(b./a); %this gives me the right answer

figure(1)
plot(phase_bad_re)
hold on
plot(phase_good_re,'--r')
legend('bad phase', 'good phase')
title('real number')

这是实数的图 -

enter image description here

当我使用angle()时为什么振荡?

2 个答案:

答案 0 :(得分:4)

Matlab文档告诉您如何计算:

  

角度函数可以表示为angle(z) = imag(log(z)) = atan2(imag(z),real(z))

https://www.mathworks.com/help/matlab/ref/angle.html

请注意,他们使用atan2而不是atan来定义它。

现在您的数据处于余弦值范围内,包括正数和负数。正数上的角度应为0,负数上的角度一般应为pi的奇数倍。使用他们选择的特定定义来获得唯一的答案,它是pi。这就是你得到的。 (实际上,对于正数,pi的任何偶数整数倍都可以,但0是“自然”选择,是从atan2获得的选择。)

如果您不清楚为什么负数没有角度= 0,请在复平面中绘制出来,并记住复数的径向部分是正面的。对于 z = r * exp(i*theta)而言,rtheta,而CSS由您正在计算的这个角度给出。

答案 1 :(得分:1)

由于余弦函数的符号周期性地改变,因此角度()也振荡。

请试试这个。

a=angle(1);
b=angle(-1);

1 + i * 0的相位为0,而-1 + i * 0的相位为3.14。

但是,在atan的情况下,b / a总是0,因此atan()的结果都是0。