Развертывание atan против atan2

Я могу извлечь фазу комплексного числа в Matlab, используя atan() или же atan2() функции.

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() фаза.

Инжир.

1 ответ

Решение

Второй аргумент unwrap это не период входных данных, а допуск. Функция всегда разворачивает данные, предполагая интервал 2π. То есть он хочет видеть, что x(i)-x(i+1) больше, чем допуск до распаковки, и меньше после распаковки. В случае допуска pi/2если, например, x(i)=0 а также x(i+1)=3, скачок больше, чем допуск, но сложение или вычитание 2*pi в x(i+1) не улучшает вещи.

Одним из обходных путей было бы умножить ввод на 2 и разделить на 2 после распаковки:

unwrap(theta_atan * 2) / 2

Тем не менее, это всегда лучше использовать atan2 получить угол.

Другие вопросы по тегам