实数的角度()

angle() of a real number

我对 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()时会出现振荡???

由于余弦函数的符号是​​周期性变化的,所以angle()也是振荡的。

请试试这个。

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

1+i*0相位为0,-1+i*0相位为3.14

但是,对于atan,b/a总是0,所以atan()的结果全为0。

Matlab 文档告诉您如何计算:

The angle function can be expressed as angle(z) = imag(log(z)) = atan2(imag(z),real(z)).

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

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

现在你的数据在余弦范围内,包括正数和负数。一般来说,正数的角度应该是0,负数的角度应该是圆周率的odd-integer倍数。使用他们选择的特定定义来获得唯一的答案,它是 pi。那就是你得到的。 (实际上,对于正数,pi 的任何 even-integer 倍数都可以,但是 0 是 "natural" 的选择,也是您从 atan2 得到的那个。)

如果您不清楚为什么负数的角度不为 0,请在复平面上绘制它 并记住复数的径向部分是正的定义。即 z = r * exp(i*theta)positive rtheta 由您正在计算的角度给出。