无需重新设置参数的复杂角度计算:连续无界角度
Complex angle calculation with no reset of argument: continuous unbounded angle
考虑以下示例 Simulink (Download example) 系统:
输入是一个幅度和一个不断增加的角度,这将 return 两个正弦,如预期的实部和虚部:
从实部和虚部计算幅度是没有问题的。获取域中的角度 between -pi and pi neither:
但我真的很难从虚部和实部计算 原始 角度。您对如何消除不连续性(黄线,最后一张图片)有什么想法吗?
使用名为 unwrap
的块。如果工具箱不可用,可以使用 simulink 中的这种离散实现:
正是我要找的东西,但如果 DSP 系统工具箱 不可用,就像我的项目合作伙伴一样,我想出了使用以下解决方案:
与
function [y, corr] = phase_unwrap(zz,z,v)
%#codegen
d = diff([v,z,zz]);
if abs(d(1)) > pi
y = sign(d(1));
corr = -3/2*d(2);
else
y = 0;
corr = -3/2*d(1);
end
end
离散时间积分器具有与零阶保持相同的采样时间和2*pi
的增益.
示例输出令人满意,但我仍然需要针对真实案例进行测试。
这个例子怎么样?
function [ub_ang,ang] = phase_unwrap(re, im, theta)
%#codegen
ang = atan2(im,re);
tmp = [theta ang];
uang = unwrap(tmp);
ub_ang = uang(2);
Scope1 图如下
范围图如下。
考虑以下示例 Simulink (Download example) 系统:
输入是一个幅度和一个不断增加的角度,这将 return 两个正弦,如预期的实部和虚部:
从实部和虚部计算幅度是没有问题的。获取域中的角度 between -pi and pi neither:
但我真的很难从虚部和实部计算 原始 角度。您对如何消除不连续性(黄线,最后一张图片)有什么想法吗?
使用名为 unwrap
的块。如果工具箱不可用,可以使用 simulink 中的这种离散实现:
与
function [y, corr] = phase_unwrap(zz,z,v)
%#codegen
d = diff([v,z,zz]);
if abs(d(1)) > pi
y = sign(d(1));
corr = -3/2*d(2);
else
y = 0;
corr = -3/2*d(1);
end
end
离散时间积分器具有与零阶保持相同的采样时间和2*pi
的增益.
示例输出令人满意,但我仍然需要针对真实案例进行测试。
这个例子怎么样?
function [ub_ang,ang] = phase_unwrap(re, im, theta)
%#codegen
ang = atan2(im,re);
tmp = [theta ang];
uang = unwrap(tmp);
ub_ang = uang(2);
Scope1 图如下
范围图如下。