Eindimensionales Problem beim Auspacken der PhaseWo soll ich anfangen? Ich habe ursprünglich um Hilfe gebeten (siehe Link unten), wie man einen pauschalen 360-Grad-Flip basierend auf einem Spezifikationswert macht, aber etwas gründlicher untersucht, was nicht funktioniert, weil die Phase abgeschlossen ist. Es gibt einen Prozess, um die Phase in eine kontinuierliche Form abzuwickeln.
Der Prozess ist wie folgt: (unter Verwendung von Radianwerten)
1) Beginnen Sie mit der zweiten Probe von links im umhüllten Phasensignal.
2) Berechnen Sie die Differenz zwischen der aktuellen Stichprobe und ihrem direkt benachbarten linken Nachbarn.
3) Wenn die Differenz zwischen den beiden größer als + π ist, subtrahieren Sie 2π von dieser Stichprobe und auch von allen Stichproben rechts davon.
4) Wenn der Unterschied zwischen den beiden kleiner als -π ist, addieren Sie 2π zu dieser Probe und auch zu allen Proben rechts davon.
5) Wurden alle Proben verarbeitet? Wenn Nein, fahren Sie mit Schritt 2 fort. Wenn ja, dann hör auf
Ich suche Unterstützung bei der Durchführung dieses Vorgangs und habe eine Beispieldatentabelle als Referenz beigefügt.
In dieser Datentabelle muss ich auspacken nach: RowCol ,: channel ,: teststate und refstate.
Danke im Voraus
// 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
DatentabelleGrafikSkriptingBetreff: Eindimensionales Problem beim Auspacken der PhaseIrgendeine Idee, wie das richtige Ergebnis aussehen würde? Ähnliches:
Umhüllte Phase:

Sollte dies geändert werden?

Das Ausführen dieses Skripts ist ziemlich langsam, kann aber höchstwahrscheinlich so optimiert werden, dass es schneller ist (es hat auch ein Problem, wenn sich der letzte Wert in der falschen Phase befindet):
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)}
)
)
);Problem mit der letzten Probe:

Betreff: Eindimensionales Problem beim Auspacken der PhaseDas ist großartige Arbeit @jthi .
(Bild 1): Ich würde denken, dass es richtig ist, solange die Kurve die gleiche Form der Teile / Kanäle hat, die nicht die umhüllte Phase hatten. Ich werde mit den Testleuten überprüfen.
(Bild 2): Ich denke, dass die blaue Linie (Kanal 0) tot ist, aber die anderen 3 Kanäle hatten eine enorme Anzahl von Phasen und Ihr Skript hat es geschafft.
(Bild 3): Damit kann ich vorerst leben, da wir zwei (2) mittlere Indizes und nicht den letzten untersuchen.
Was die Optimierung des Skripts betrifft, würde ich nicht einmal wissen, wo ich anfangen soll. Vielleicht könnte sich jemand mit Vorschlägen in diesen Thread einmischen.
Auch dies ist großartig und kann Ihnen nicht genug für die Hilfe danken. Da wir die Phase willkürlich ausgepackt haben, besteht das Potenzial, gute Teile auszusortieren. Ich bin mir nicht sicher, ob wir schlechte Teile verschickt haben, bis ich mich weiter damit beschäftigen kann.
Betreff: Eindimensionales Problem beim Auspacken der PhaseIch blicke zurück auf das Skript und wende es auf einen anderen Datensatz an, und ich glaube, wir sind noch nicht ganz da. Ich werde ein bisschen darüber nachdenken müssen. Es ist nah...