MATLAB:解包功能

时间:2010-07-07 15:40:12

标签: matlab

我正在与Mathworks的某个人进行讨论:unwrap函数中除了π之外还有一个“bug”跳跃容差,并希望得到一些其他观点:

  

描述

     当P的连续元素之间的绝对跳跃大于或等于π弧度的默认跳跃容差时,

Q = unwrap(P)通过加上±2π的倍数来校正向量P中的弧度相位角。如果P是矩阵,则unwrap按列操作。如果P是一个多维数组,则unwrap将在第一个非单体维上运行。

     

Q = unwrap(P,tol)使用跳转容差tol而不是默认值π。

文档有两种可能的解释:

  1. 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
    
  2. 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
    
  3. unwrap()在MATLAB中的实际行为(至少达到R2010a)为#1。我对unwrap()的解释是它应该是#2,因此行为中存在错误。如果unwrap()的行为与#2匹配,那么展开可以用作缓慢变化输入的mod的逆,即对于向量x的unwrap(mod(x,T),T/2) = x,其中连续元素的变化小于tol = T / 2 。

    请注意,第二种解释比角度更通用,并且可以用环绕周期T展开任何内容。(对于弧度,默认值T =2π,对于度数是360,对于8位数字是256,对于16-是65536)比特数等。)

    所以我的问题是:

    行为#1是否有可能用途?哪种解释更有意义?

4 个答案:

答案 0 :(得分:6)

解释#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

或者只是制作自己的功能:

function ret = generic_unwrap(x, T)
  ret = T * unwrap(x * 2 * pi / T) / (2 * pi);
end

答案 1 :(得分:1)

Behavor#1有意义,因为假设输入是弧度,而不是。如果你超过跳跃容差,调整会增加pi / 2,所以没关系。

如果unwrap具有允许它在任何类型的系列上工作的功能,而不仅仅是弧度角度,那将是多么好的。

跳跃容差不足以判断您是否有弧度,度数或任何其他类型的系列,因此需要额外的输入。

答案 2 :(得分:1)

我一直认为第二种行为是实际行为,但从未测试过。对帮助文件的文字读取确实表明行为#1。但这不是人们想做的事情。举个简单的例子,考虑以度数进行展开

x = mod(0:30:720, 360)
y = unwrap(x,180)

显然你会想要y = 0:30:720,但你会得到......

  

y =

Columns 1 through 7

     0   30.0000   60.0000   90.0000  120.0000  150.0000  180.0000

Columns 8 through 14

210.0000  240.0000  270.0000  300.0000  330.0000  333.0088  363.0088

Columns 15 through 21

393.0088  423.0088  453.0088  483.0088  513.0088  543.0088  573.0088

Columns 22 through 25

603.0088  633.0088  663.0088  666.0176

这是错误的(y不再对应于与x相同的角度,这是解包的点)

任何人都可以举例说明你何时想要行为#1(当前的行为?)

答案 3 :(得分:-1)

x = mod(0:30*pi/180:4*pi, 2*pi);
y = unwrap(x)*180/pi;

它以弧度为单位,但不是以度为单位。