Problema de desenvolvimiento de fase unidimensional¿Dónde empezar? Originalmente pedí ayuda (ver enlace a continuación) sobre cómo hacer un giro de 360 grados de manta en función de un valor de especificación, sin embargo, investigando un poco más a fondo que no funcionará porque la fase está envuelta. Existe un proceso para desenvolver la fase en una forma continua.
El proceso es el siguiente: (usando valores en radianes)
1) Comience con la segunda muestra de la izquierda en la señal de fase envuelta.
2) Calcule la diferencia entre la muestra actual y su vecino de la izquierda directamente adyacente.
3) Si la diferencia entre los dos es mayor que + π, reste 2π de esta muestra y también de todas las muestras a la derecha.
4) Si la diferencia entre los dos es menor que -π, agregue 2π a esta muestra y también a todas las muestras a la derecha.
5) ¿Se han procesado todas las muestras? Si la respuesta es No, vuelva al paso 2. Si es así, deténgase
Estoy buscando ayuda para realizar esta operación y he adjuntado una tabla de datos de muestra como referencia.
En esta tabla de datos, necesito desenvolver por: RowCol,: channel,: teststate y refstate.
Gracias por adelantado
// You can plot the data according to the scripts below
// This is what i think is a wrapped phase
_dt = Current Data Table();
gb = _dt << Graph Builder(
Size( 1326, 1002 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :index ), Y( :radians ), Overlay( :RowCol_PartNo_Ch ) ),
Elements( Line( X, Y, Legend( 8 ) ) ),
Local Data Filter(
Add Filter(
columns( :teststate, :refstate, :channel, :RowCol ),
Where( :teststate == 11 ),
Where( :refstate == 1 ),
Where( :channel == {"0", "1", "2", "3"} ),
Where( :RowCol == "r3c1sr3sc1" ),
Display( :channel, N Items( 4 ) ),
Display( :RowCol, N Items( 15 ), Find( Set Text( "" ) ) )
)
),
SendToReport(
Dispatch(
{},
"index",
ScaleBox,
{Min( 4.3125 ), Max( 22.6875 ), Inc( 1 ), Minor Ticks( 4 )}
)
)
);
// This is what i think is a normal (continuous form)
_dt = Current Data Table();
gb = _dt << Graph Builder(
Size( 1326, 1002 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :index ), Y( :radians ), Overlay( :RowCol_PartNo_Ch ) ),
Elements( Line( X, Y, Legend( 8 ) ) ),
Local Data Filter(
Add Filter(
columns( :teststate, :refstate, :channel, :RowCol ),
Where( :teststate == 11 ),
Where( :refstate == 1 ),
Where( :channel == {"0", "1", "2", "3"} ),
Where( :RowCol == "r3c1sr3sc0" ),
Display( :channel, N Items( 4 ) ),
Display( :RowCol, N Items( 15 ), Find( Set Text( "" ) ) )
)
),
SendToReport(
Dispatch(
{},
"index",
ScaleBox,
{Min( 4.3125 ), Max( 22.6875 ), Inc( 1 ), Minor Ticks( 4 )}
)
)
);
https://community.jmp.com/t5/Discussions/Changing-column-values-based-on-the-column-spec-limit/mp/378999#M62877
Tabla de datosGráficosScriptingRe: Problema de desenvolvimiento de fase unidimensional¿Alguna idea de cómo sería el resultado correcto? Algo parecido a esto:
Fase envuelta:

¿Debería cambiarse esto?

Ejecutar este script será bastante lento, pero lo más probable es que se pueda optimizar para que sea más rápido (también tiene un problema si el último valor está en la fase incorrecta):
Names Default To Here(1);
dt = Current Data Table();
dt << New Column("supportindex", Character, "Nominal",
<< Set Each Value(:rowcol || char(:channel)||char(:teststate)||char(:refstate))
);
dt << New Column("radians_cont", Numeric, "Continuous");
Summarize(dt, uniqValues = by(:supportIndex));
For(i = 1, i <= N Items(uniqValues), i++,
valIndex = Loc(Column(dt, "supportIndex") << get as matrix, uniqValues[i]);
m = Column(dt, "radians")[valIndex];
deduction = 0;
nr = N Items(m);
For(k = 2, k <= nr - 1, k++,
rad_dif = m[k - 1] - m[k];
If(rad_dif > pi(), deduction = 2*pi(),
rad_dif < -1*pi(), deduction = -2*pi(),
deduction = 0;
);
m[k::nr] = m[k::nr] + deduction;
);
dt[valIndex, "radians_cont"] = m;
);
dt << Delete Columns("supportindex");
gb = dt << Graph Builder(
Size(1326, 1002),
Show Control Panel(0),
Show Legend(0),
Variables(X(:index), Y(:radians), Y(:radians_cont), Overlay(:RowCol_PartNo_Ch)),
Elements(Position(1, 1), Line(X, Y, Legend(11))),
Elements(Position(1, 2), Line(X, Y, Legend(12))),
Local Data Filter(
Add Filter(
columns(:teststate, :refstate, :channel, :RowCol),
Where(:teststate == 11),
Where(:refstate == 1),
Where(:channel == {"0", "1", "2", "3"}),
Where(:RowCol == "r3c1sr3sc1"),
Display(:channel, N Items(4), Size(178, 68)),
Display(:RowCol, N Items(15), Size(161, 255), Find(Set Text("")))
)
),
SendToReport(
Dispatch(
{},
"index",
ScaleBox,
{Min(4.3125), Max(22.6875), Inc(1), Minor Ticks(4)}
)
)
);Problema con la última muestra:

Re: Problema de desenvolvimiento de fase unidimensionalEste es un gran trabajo @jthi .
(imagen 1): Creo que siempre que la curva mantenga la misma forma de las partes / canal que no tenían la fase envuelta, es correcta. Verificaré con la gente de prueba.
(imagen 2): Creo que la línea azul (canal 0) está muerta, pero los otros 3 canales tenían una gran cantidad de fases envueltas y su guión funcionó.
(imagen 3): Puedo vivir con eso por ahora, ya que estamos evaluando en dos (2) índices medios y no en el último.
En cuanto a la optimización del guión, ni siquiera sabría por dónde empezar. Tal vez alguien podría intervenir en este hilo con sugerencias.
Una vez más, esto es genial y no puedo agradecerles lo suficiente por la ayuda. Debido a que estábamos desenvolviendo arbitrariamente la fase, existe la posibilidad de descartar partes buenas. No estoy seguro de si estamos enviando piezas defectuosas hasta que pueda investigar un poco más.
Re: Problema de desenvolvimiento de fase unidimensionalMiro hacia atrás en el guión y lo aplico a otro conjunto de datos y no creo que estemos del todo allí todavía. Voy a tener que pensar un poco en esto. Está cerca...