我对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')
这是复数的图 -
请注意,我可以使用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')
这是实数的图 -
当我使用angle()时为什么振荡?
答案 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)
而言,r
为theta
,而CSS
由您正在计算的这个角度给出。
答案 1 :(得分:1)
由于余弦函数的符号周期性地改变,因此角度()也振荡。
请试试这个。
a=angle(1);
b=angle(-1);
1 + i * 0的相位为0,而-1 + i * 0的相位为3.14。
但是,在atan的情况下,b / a总是0,因此atan()的结果都是0。