展开 atan 与 atan2
Unwrapping atan vs. atan2
我可以使用 atan()
或 atan2()
函数在 Matlab 中提取复数的相位。
atan()
returns区间限制在[-pi/2,pi/2]
,atan2()
returns区间限制在[-pi,pi]
.
我想看看是否可以使用 unwrap()
函数在每种情况下展开提取的相位,但是 unwrap
仅对通过 atan2()
提取的相位有效。
R = 1; % Magnitude
theta = linspace(0,6*pi,100); % (radians) Angle array
theta_atan = zeros(1,length(theta)); % Prellocate for calculation
theta_atan2 = zeros(1,length(theta)); % Prellocate for calculation
X = zeros(1,length(theta)); %Prelloc.
Y = zeros(1,length(theta)); %Prelloc.
for i = 1:length(theta)
X(i) = R*cos(theta(i)); % Real part
Y(i) = R*sin(theta(i)); % Imaginary part
theta_atan(i) = atan(Y(i)/X(i));
theta_atan2(i) = atan2(Y(i),X(i));
end
我使用每种方法绘制展开的提取相位:
figure(666)
plot(theta,unwrap(theta_atan));
hold on
plot(theta,unwrap(theta_atan2));
legend('theta atan','theta atan2')
xlabel('input phase')
ylabel('extracted phase')
然而,如您所见,展开仅对 atan2()
情况有效。
即使我使用 unwrap(theta_atan, pi/2)
(在这种情况下展开是基于 pi/2 的增量而不是默认值 pi),我也无法正确展开 atan()
阶段。
unwrap
的第二个参数不是输入数据的周期,而是公差。该函数始终假设 2π 间隔解包数据。也就是说,它希望看到 x(i)-x(i+1)
在展开前大于公差,在展开后小于公差。在公差为pi/2
的情况下,如x(i)=0
和x(i+1)=3
,跳跃大于公差,但在[=上加减2*pi
17=] 没有改善。
一种解决方法是将输入乘以 2,然后在展开后除以 2:
unwrap(theta_atan * 2) / 2
但是,总是最好使用atan2
来获取角度。
我可以使用 atan()
或 atan2()
函数在 Matlab 中提取复数的相位。
atan()
returns区间限制在[-pi/2,pi/2]
,atan2()
returns区间限制在[-pi,pi]
.
我想看看是否可以使用 unwrap()
函数在每种情况下展开提取的相位,但是 unwrap
仅对通过 atan2()
提取的相位有效。
R = 1; % Magnitude
theta = linspace(0,6*pi,100); % (radians) Angle array
theta_atan = zeros(1,length(theta)); % Prellocate for calculation
theta_atan2 = zeros(1,length(theta)); % Prellocate for calculation
X = zeros(1,length(theta)); %Prelloc.
Y = zeros(1,length(theta)); %Prelloc.
for i = 1:length(theta)
X(i) = R*cos(theta(i)); % Real part
Y(i) = R*sin(theta(i)); % Imaginary part
theta_atan(i) = atan(Y(i)/X(i));
theta_atan2(i) = atan2(Y(i),X(i));
end
我使用每种方法绘制展开的提取相位:
figure(666)
plot(theta,unwrap(theta_atan));
hold on
plot(theta,unwrap(theta_atan2));
legend('theta atan','theta atan2')
xlabel('input phase')
ylabel('extracted phase')
然而,如您所见,展开仅对 atan2()
情况有效。
即使我使用 unwrap(theta_atan, pi/2)
(在这种情况下展开是基于 pi/2 的增量而不是默认值 pi),我也无法正确展开 atan()
阶段。
unwrap
的第二个参数不是输入数据的周期,而是公差。该函数始终假设 2π 间隔解包数据。也就是说,它希望看到 x(i)-x(i+1)
在展开前大于公差,在展开后小于公差。在公差为pi/2
的情况下,如x(i)=0
和x(i+1)=3
,跳跃大于公差,但在[=上加减2*pi
17=] 没有改善。
一种解决方法是将输入乘以 2,然后在展开后除以 2:
unwrap(theta_atan * 2) / 2
但是,总是最好使用atan2
来获取角度。