我正在与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/

    10-13 00:28