2010-07-07 13 views
5

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:

  1. 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 
    
  2. 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?

Respuesta

1

behavor # 1 tiene sentido, ya que la entrada se supone que es radianes, no grados. El ajuste agrega pi/2 si está por encima de la tolerancia al salto, así que está bien.

Lo que sería bueno si el desenrollado tuviera una función que le permitiera funcionar en cualquier tipo de serie, no simplemente en ángulos de radianes.

La tolerancia al salto no es suficiente para saber si tiene una serie en radianes, grados o cualquier otro tipo, por lo que tendría que haber una entrada adicional.

+0

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. –

+0

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

+1

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. –

1

Siempre había supuesto que el segundo comportamiento era el real, pero nunca lo probé. Una lectura literal del archivo de ayuda indica el comportamiento # 1. Pero eso no es lo que uno querría hacer. Como un simple ejemplo, considere hacer una desenvolver en grados

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

, obviamente, le gustaría que y = 0: 30: 720, sino que puedes ser ...

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 

que está mal (y ya no corresponde al mismo ángulo que x, que es el punto de unwrap)

¿Alguien puede dar un ejemplo de cuándo desea el comportamiento n. ° 1 (el comportamiento actual)

5

La interpretación n. ° 1 es cómo leo la documentación y creo que tiene sentido. Me podría imaginar usarlo para reconstruir la distancia manejada desde un codificador de rueda. Para velocidades lentas, la tolerancia no importa, pero para velocidades altas (lo suficientemente altas como para violar el teorema de muestreo, es decir, tienes menos de dos muestras por rotación de rueda), la tolerancia te ayuda a obtener la reconstrucción correcta si conoces la dirección.

Otra razón por la que # 1 tiene más sentido es, probablemente, que el desenvuelto común se puede extender fácilmente a uno genérico y, por lo tanto, no hay necesidad directa de que el período sea un parámetro.

% 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 

o simplemente hacer su propia función:

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

Comentario muy tardío, pero ¿cómo saber la dirección si viola la teoría del muestreo? ¡No hay manera de saber! Estoy de acuerdo con la pregunta original: el comportamiento # 1 parece inútil, mientras que el comportamiento # 2 podría ser útil para contadores digitales, ángulos en grados, ... –

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

Funciona en radianes, pero no en grados.

+0

Lea la pregunta; No estaba preguntando cómo implementarlo, estaba preguntando cuál es el mejor comportamiento. –

Cuestiones relacionadas