我正在与 Mathworks 的某人讨论:unwrap http://www.mathworks.com/access/helpdesk/help/techdoc/ref/unwrap.html函数中对于 π 以外的跳跃容差有一个“bug”,并且希望获得一些其他观点:
描述
Q = unwrap(P)
当 P 的连续元素之间的绝对跳跃大于或等于 π 弧度的默认跳跃容差时,通过添加 ±2π 的倍数来校正向量 P 中的弧度相位角。如果 P 是矩阵,则 unwrap 按列进行运算。如果 P 是多维数组,则 unwrap 对第一个非单维进行操作。
Q = unwrap(P,tol)
使用跳跃容差 tol 代替默认值 π。
该文档有两种可能的解释:
-
Q = unwrap(P,tol)
当 P 的连续元素之间的绝对跳跃大于或等于 tol 弧度时,通过添加 ±2π 的倍数来校正向量 P 中的弧度相位角。如果 P 是矩阵,则 unwrap 按列进行运算。如果 P 是多维数组,则 unwrap 对第一个非单维进行操作。
Example:
>> 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 对第一个非单维进行操作。
Example:
>> 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 匹配,那么 unwrap 可以用作缓慢变化输入的 mod 的逆函数,即unwrap(mod(x,T),T/2) = x
对于向量 x,其中连续元素的变化小于 tol=T/2。
请注意,第二种解释比角度更通用,并且可以用环绕周期 T 展开任何内容。(无论默认值 T=2π(弧度)、360(度数)、256(8 位数字)、65536(16 位数字), ETC。)
所以我的问题是:
行为 #1 有可能的用途吗?哪种解释更有意义?
解释 #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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)