Развертывание 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
получить угол.