2010-07-07 101 views
5

我与来自Mathworks公司的人讨论我回复:unwrap功能,拥有比其他π跳公差在它“错误”,并希望得到一些其他观点:MATLAB:解包功能

说明

Q = unwrap(P)通过添加&plusmn倍数校正在矢量P弧度的相位角; 2,当P的连续元件之间的绝对跳转大于或等于的π弧度默认跳跃公差π。如果P是一个矩阵,则解包操作以列为单位。如果P是一个多维数组,则unwrap将在第一个非单一维上运行。

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

有文档的两种可能的解释:

  1. Q = unwrap(P,tol)通过添加&plusmn倍数校正在矢量P弧度的相位角; P的连续元件之间的2个π当绝对跳转被更大大于或等于tol弧度。如果P是一个矩阵,则解包操作以列为单位。如果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)通过添加&plusmn倍数校正在矢量P的元素; 2 * TOL当P的连续元件之间的绝对跳转大于或等于TOL。如果P是一个矩阵,则解包操作以列为单位。如果P是一个多维数组,则unwrap将在第一个非单一维上运行。

    实施例:

    >> x = mod(0:20:200,100); unwrap(x, 50) 
    ans = 
        0 20 40 60 80 100 120 140 160 180 200 
    

unwrap() MATLAB中的实际行为(至少到R2010a版本)为#1。我对unwrap()的解释是它应该是#2,因此在行为上存在一个错误。如果unwrap()的行为与#2匹配,则对于缓慢变化的输入,即,对于矢量x,其中连续元素变化小于tol = T/2,则解缠可以用作mod的逆。

请注意,此第二种解释比角度更一般,并且可以用环绕周期T解开任何东西。(对于弧度,是否默认为T = 2 π,对于度数为360,对于8位数字是256,对于65536 16位号码等)

所以我的问题是:

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

回答

1

Behavor#1是有道理的,因为输入被假定为弧度,不。如果你高于跳跃容忍度,调整会增加pi/2,所以没关系。

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

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

+0

有趣......我的解释#2的观点是(正如你所提到的)那里真的没有任何特定的与弧度,度数或任何角度的联系,除了环绕时期,默认情况下是2pi,但可以是任何东西(对于度数是360,对于16位整数是65536等)。跳跃宽容应该是环绕期的1/2 ...我不确定为什么你会选择两者之间的不同关系。 – 2010-07-07 16:39:12

+0

我想你可以有两种方法来实现这个功能。无论是特定于弧度(如文档中所述),并且您可以自由选择跳转公差。或者你在1/2环绕时修复跳转容限,并且你将该输入用于任何类型的范围。 – Jonas 2010-07-07 18:28:38

+1

我会为后者投票,但这只是我的承担。我可能最终只是编写自己的函数(这是相当简单的),而不再依赖于Mathworks的正确运行的unwrap()实现。 – 2010-07-07 20:45:16

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(当前行为?)的例子

5

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

评论很晚,但如果您违反抽样理论,您会如何知道方向?没有办法知道!我同意原来的问题:行为#1似乎没用,而行为#2可能对数字计数器,角度度数有用...... – 2015-02-15 12:53:15

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

它工作在弧度而不是在度。

+0

请阅读问题;我没有问如何实现它,我问的是最好的行为。 – 2017-04-04 18:03:43