我正在与Mathworks的某人讨论: unwrap
函数,其中包含一个“错误”,用于除π之外的跳转容限,并希望获得其他一些观点:
该文档有两种可能的解释:
Q = unwrap(P,tol)
通过在P的连续元素之间的绝对跳变大于或等于tol弧度时,通过相加±2π的倍数来校正矢量P中的弧度相位角。如果P是矩阵,则展开操作将按列进行。如果P是多维数组,则展开将在第一个非单维度上进行。例子:
>> 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
Q = unwrap(P,tol)
通过在P的连续元素之间的绝对跳变大于或等于tol时相加±2 * tol的倍数来校正向量P中的元素。如果P是矩阵,则展开操作将按列进行。如果P是多维数组,则展开将在第一个非单维度上进行。例子:
>> x = mod(0:20:200,100); unwrap(x, 50)
ans =
0 20 40 60 80 100 120 140 160 180 200
MATLAB中
unwrap()
的实际行为(至少达到R2010a)为#1。我对unwrap()
的解释是它应该是#2,因此行为上有错误。如果unwrap()
的行为与#2相匹配,则可以将unwrap用作mod的逆函数以用于缓慢变化的输入,即对于向量x的unwrap(mod(x,T),T/2) = x
,其中连续元素的变化小于tol = T/2。请注意,第2种解释比角度更笼统,并且可以用回绕期T解开任何内容。(弧度的默认值T =2π,度数的默认值是360,度数的默认值是256,16位数字的值是65536,等等。)
所以我的问题是:
行为1有可能的用途吗?哪种解释更有意义?
最佳答案
解释#1是我阅读文档的方式,我认为这是有道理的。我可以想象用它来重建车轮编码器的驱动距离。对于低速,公差并不重要,但是对于高速(足够高以违反采样定理,即每个车轮旋转少于两个样本),如果您知道方向,公差将帮助您进行正确的重构。
#1更具意义的另一个原因可能是,普通的拆包可以轻松地扩展为通用的拆包,因此,不需要直接将period作为参数。
% 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
或只是使您自己的功能:
function ret = generic_unwrap(x, T)
ret = T * unwrap(x * 2 * pi / T) / (2 * pi);
end
关于MATLAB:解包函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3196388/