我正在与Mathworks的某个人进行讨论:这个unwrap函数除了π之外还有一个"bug"用于跳转容差,并希望得到一些其他的观点:
描述
Q = unwrap(P)当P的连续元素之间的绝对跳跃大于或等于π弧度的默认跳跃容差时,通过加上±2π的倍数来校正向量P中的弧度相位角.如果P是矩阵,则unwrap按列操作.如果P是多维数组,则unwrap对第一个非单体维度进行操作.
Q = unwrap(P,tol)使用跳转容差tol而不是默认值π.
文档有两种可能的解释:
Q = unwrap(P,tol)当P的连续元素之间的绝对跳跃大于或等于tol弧度时,通过加上±2π的倍数来校正向量P中的弧度相位角.如果P是矩阵,则unwrap按列操作.如果P是多维数组,则unwrap对第一个非单体维度进行操作.
例:
>> x = mod(0:20:200,100); unwrap(x, 50)
ans =
0 20.0000 40.0000 60.0000 80.0000 81.6814 101.6814 121.6814 141.6814 161.6814 163.3628
Run Code Online (Sandbox Code Playgroud)Q = unwrap(P,tol)当P的连续元素之间的绝对跳跃大于或等于tol时,通过加上±2*tol的倍数来校正向量P中的元素.如果P是矩阵,则unwrap按列操作.如果P是多维数组,则unwrap对第一个非单体维度进行操作.
例:
>> x = mod(0:20:200,100); unwrap(x, 50)
ans =
0 20 40 60 80 100 120 140 160 180 200
Run Code Online (Sandbox Code Playgroud)unwrap()MATLAB中的实际行为(至少达到R2010a)是#1.我的解释unwrap()是,它应该是#2,因此行为中存在错误.如果unwrap()行为匹配#2,那么展开可以用作缓慢变化输入的mod的逆,即unwrap(mod(x,T),T/2) = x对于向量x,其中连续元素变化小于tol = T/2.
请注意,第二种解释比角度更通用,并且可以用环绕周期T展开任何内容.(对于弧度,默认值T =2π,对于度数是360,对于8位数字是256,对于16位数字是65536,等等.)
所以我的问题是:
行为#1是否有可能用途?哪种解释更有意义?
解释#1是我如何阅读文档,我认为这是有道理的.我可以想象用它来重建车轮编码器的驱动距离.对于慢速,公差无关紧要,但对于高速(高到足以违反采样定理,即每轮转动少于两个样本),如果您知道方向,公差可帮助您获得正确的重建.
#1更有意义的另一个原因可能是普通的展开可以很容易地扩展到通用展开,因此没有直接需要将周期作为参数.
% example for 16 bit integers
>> x1 = [10 5 0 65535 65525];
T = 65536;
x2 = T * unwrap(x1 * 2 * pi / T) / (2 * pi)
x2 =
10.0000 5.0000 0 -1.0000 -11.0000
Run Code Online (Sandbox Code Playgroud)
或者只是制作自己的功能:
function ret = generic_unwrap(x, T)
ret = T * unwrap(x * 2 * pi / T) / (2 * pi);
end
Run Code Online (Sandbox Code Playgroud)
行为 #1 是有道理的,因为假设输入是弧度,而不是度数。如果超出跳跃容差,则调整会增加 pi/2,所以没关系。
如果 unwrap 具有一个功能,允许它适用于任何类型的系列,而不仅仅是弧度角,那就太好了。
跳跃容差不足以判断您是否有弧度、度数或任何其他类型的系列,因此需要额外的输入。