Problema di disimballaggio della fase unidimensionaleDa dove cominciare? Inizialmente ho chiesto aiuto (vedi link sotto) su come fare un capovolgimento di 360 gradi della coperta in base a un valore di specifica, tuttavia esaminando un po 'più a fondo che non funzionerà perché la fase è avvolta. C'è un processo per scartare la fase in una forma continua.
Il processo è il seguente: (utilizzando i valori in radianti)
1) Inizia con il secondo campione da sinistra nel segnale di fase avvolto.
2) Calcola la differenza tra il campione corrente e il suo vicino di sinistra direttamente adiacente.
3) Se la differenza tra i due è maggiore di + π, sottrarre 2π da questo campione e anche da tutti i campioni a destra di esso.
4) Se la differenza tra i due è minore di -π, aggiungi 2π a questo campione e anche a tutti i campioni alla sua destra.
5) Sono stati processati tutti i campioni? In caso negativo, tornare al passaggio 2. Se sì, allora fermati
Sto cercando assistenza per eseguire questa operazione e ho allegato una tabella di dati di esempio come riferimento.
In questa tabella dati ho bisogno di scartare da: RowCol,: channel,: teststate e refstate.
Grazie in anticipo
// 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
Tabella datiGraficaScriptingOggetto: Problema di disimballaggio della fase unidimensionaleQualche idea su come sarebbe il risultato corretto? Qualcosa di simile a questo:
Fase avvolto:

Questo dovrebbe essere cambiato?

L'esecuzione di questo script sarà abbastanza lenta, ma molto probabilmente può essere ottimizzata per essere più veloce (ha anche un problema se l'ultimo valore è in una fase sbagliata):
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 l'ultimo campione:

Oggetto: Problema di disimballaggio della fase unidimensionaleQuesto è un ottimo lavoro @jthi .
(figura 1): penso che fintanto che la curva mantiene la stessa forma delle parti / canale che non avevano la fase di avvolgimento, è corretto. Verificherò con le persone del test.
(immagine 2): Penso che la linea blu (canale 0) sia morta ma gli altri 3 canali avevano un numero enorme di fasi avvolte e il tuo script ha funzionato.
(immagine 3): per ora posso conviverci visto che stiamo proiettando a due (2) indici medi e non all'ultimo.
Per quanto riguarda l'ottimizzazione dello script, non saprei nemmeno da dove cominciare. Forse qualcuno potrebbe intervenire su questo thread con suggerimenti.
Di nuovo, è fantastico e non posso ringraziarti abbastanza per l'aiuto. Poiché stavamo aprendo arbitrariamente la fase, esiste il potenziale per escludere parti buone. Non sono sicuro se stessimo inviando parti difettose finché non potrò approfondire ancora un po '.
Oggetto: Problema di disimballaggio della fase unidimensionaleSto guardando indietro alla sceneggiatura e applicandola a un altro insieme di dati e non credo che siamo ancora del tutto arrivati. dovrò pensarci un po 'su questo. È chiusa...