实数的角度()
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 r
和 theta
由您正在计算的角度给出。
我对 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 r
和 theta
由您正在计算的角度给出。