Estoy en una discusión con alguien de Mathworks re: la función unwrap
que tiene un "bug" en él para tolerancias de salto distintos π, y que le gustaría obtener algunas otras perspectivas:MATLAB: la función Separar
Descripción
Q = unwrap(P)
corrige los ángulos de fase en radianes en un vector P mediante la adición de múltiplos de y plusmn; 2 π cuando saltos absolutos entre los elementos consecutivos de P son mayores que o igual a la tolerancia predeterminada salto de π radianes. Si P es una matriz, desenvolver funciona en forma de columna. Si P es una matriz multidimensional, unwrap opera en la primera dimensión no única.
Q = unwrap(P,tol)
utiliza un tol de tolerancia de salto en lugar del valor predeterminado, π.
Hay dos posibles interpretaciones de la documentación:
Q = unwrap(P,tol)
corrige los ángulos de fase en radianes en un vector P mediante la adición de múltiplos de y plusmn; 2 π saltos cuando absolutas entre elementos consecutivos de P son mayor que o igual a tol radianes. Si P es una matriz, desenvolver funciona en forma de columna. Si P es una matriz multidimensional, unwrap opera en la primera dimensión no única.Ejemplo:
>> 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)
corrige los elementos de un vector P mediante la adición de múltiplos de y plusmn; 2 * tol cuando saltos absolutos entre los elementos consecutivos de P son mayores que o igual a tol. Si P es una matriz, desenvolver funciona en forma de columna. Si P es una matriz multidimensional, unwrap opera en la primera dimensión no única.Ejemplo:
>> x = mod(0:20:200,100); unwrap(x, 50) ans = 0 20 40 60 80 100 120 140 160 180 200
el comportamiento real de unwrap()
en MATLAB (al menos hasta R2010a) es # 1. Mi interpretación de unwrap()
es que se supone que es # 2, y por lo tanto hay un error en el comportamiento. Si el comportamiento de unwrap()
coincidiera con el n. ° 2, entonces desenvolver podría usarse como un inverso para mod para entradas que varían lentamente, es decir, unwrap(mod(x,T),T/2) = x
para vectores x donde los elementos sucesivos varían en menos de tol = T/2.
Tenga en cuenta que esta segunda interpretación es más general que ángulos, y puede desenvolver cualquier cosa con un período envolvente T. (ya sea un valor predeterminado de T = 2 π para radianes, 360 para grados, 256 para números de 8 bits, 65536 para números de 16 bits, etc.)
Así que mi pregunta es:
¿hay usos posibles del comportamiento # 1? ¿Qué interpretación tiene más sentido?
interesante ... mi punto con la interpretación # 2 es que (como usted menciona) realmente no hay ningún vínculo particular con los ángulos en radianes, grados o lo que sea, excepto el período envolvente, que por defecto es 2pi, pero puede ser cualquier cosa (para grados es 360, para enteros de 16 bits es 65536, etc.). La tolerancia de salto se supone que es la mitad del período envolvente ... No estoy seguro de por qué alguna vez escogerías una relación diferente entre los dos. –
Supongo que podría tener dos formas de cómo funciona la función. O bien es específico de radianes (como se dice en la documentación), y puede elegir libremente su tolerancia al salto. O arreglas la tolerancia al salto en 1/2 envolvente, y estás usando esa entrada para cualquier tipo de rango. – Jonas
Yo votaría por este último, pero esa es solo mi opinión. Puedo terminar escribiendo mi propia función (es bastante trivial) y no depender más de Mathworks para una implementación unwrap() que funcione correctamente. –