解开atan与atan2

时间:2019-01-28 21:24:59

标签: matlab phase unwrap

我可以使用atan()atan2()函数在Matlab中提取复数的相位。

atan()以限制为[-pi/2,pi/2]的间隔返回,而atan2()以限制为[-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()阶段。

Fig.

1 个答案:

答案 0 :(得分:2)

unwrap的第二个参数不是输入数据的周期,而是容差。该函数总是在假设2π间隔的情况下解包数据。也就是说,它希望看到x(i)-x(i+1)大于展开前的公差,而小于展开后的公差。在容差为pi/2的情况下,例如,如果x(i)=0x(i+1)=3的跳变大于容差,而是在{{上加上或减去2*pi 1}}并不能改善事情。

一种解决方法是将输入乘以2,并在展开后除以2:

x(i+1)

但是,始终最好使用unwrap(theta_atan * 2) / 2 来获取角度。