我正在与Mathworks的某个人进行讨论:unwrap
函数中除了π之外还有一个“bug”跳跃容差,并希望得到一些其他观点:
描述
当P的连续元素之间的绝对跳跃大于或等于π弧度的默认跳跃容差时,
Q = unwrap(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
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
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是否有可能用途?哪种解释更有意义?
答案 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;
它以弧度为单位,但不是以度为单位。