Eindimensionales Phasen-Unwrapping-ProblemWo anfangen? Ich habe ursprünglich um Hilfe gebeten (siehe Link unten), wie man einen pauschalen 360-Grad-Flip basierend auf einem Spezifikationswert macht, aber ein bisschen gründlicher nachforschen, was nicht funktioniert, weil die Phase umbrochen ist. Es gibt einen Prozess zum Auspacken der Phase in eine kontinuierliche Form.
Der Prozess ist wie folgt: (unter Verwendung von Radian-Werten)
1) Beginnen Sie mit dem zweiten Sample von links im umgebrochenen Phasensignal.
2) Berechnen Sie die Differenz zwischen dem aktuellen Abtastwert und seinem direkt benachbarten linken Nachbarn.
3) Wenn die Differenz zwischen den beiden größer als +π ist, dann subtrahiere 2π von diesem Sample und auch von allen Samples rechts davon.
4) Wenn die Differenz zwischen den beiden kleiner als -π ist, addiere 2π zu diesem Sample und auch zu allen Samples rechts davon.
5) Wurden alle Proben verarbeitet? Wenn nein, gehen Sie zurück zu Schritt 2. Wenn ja, dann hör auf
Ich suche nach Unterstützung bei der Durchführung dieser Operation und habe eine Beispieldatentabelle als Referenz beigefügt.
In dieser Datentabelle muss ich nach :RowCol, :channel, :teststate und refstate auspacken.
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 )}
)
)
);
Ändern von Spaltenwerten basierend auf dem Spaltenspezifikationslimit
DatentabelleGrafikSkripterstellungBetreff: Eindimensionales Phase-Unwrapping-ProblemIch schaue zurück auf das Skript und wende es auf einen anderen Datensatz an, und ich glaube nicht, dass wir so weit sind. ich muss da mal ein bisschen nachdenken. Es ist nah...
Betreff: Eindimensionales Phase-Unwrapping-ProblemDas ist großartige Arbeit @jthi .
(Bild 1): Ich würde denken, dass, solange die Kurve die gleiche Form der Teile / des Kanals hat, die keine umwickelte Phase hatten, sie korrekt ist. Ich werde mit den Testleuten überprüfen.
(Bild 2): Ich denke, dass die blaue Leitung (Kanal 0) tot ist, aber die anderen 3 Kanäle hatten eine enorme Anzahl von umbrochenen Phasen und Ihr Skript hat es geschafft.
(Bild 3): Damit kann ich vorerst leben, da wir bei zwei (2) mittleren Indizes und nicht beim letzten Screening sind.
Was die Optimierung des Skripts betrifft, wüsste ich nicht einmal, wo ich anfangen soll. Vielleicht könnte sich jemand mit Vorschlägen in diesen Thread einklinken.
Auch dies ist großartig und ich kann Ihnen nicht genug für die Hilfe danken. Da wir die Phase willkürlich ausgepackt haben, besteht die Möglichkeit, gute Teile herauszufiltern. Ich bin mir nicht sicher, ob wir schlechte Teile geschickt haben, bis ich mich etwas mehr damit befassen kann.
Betreff: Eindimensionales Phase-Unwrapping-ProblemIrgendeine Idee, wie das korrekte Ergebnis aussehen würde? Etwas ähnliches:
Verpackte Phase:

Sollte dies geändert werden?

Das Ausführen dieses Skripts wird ziemlich langsam sein, aber höchstwahrscheinlich kann es optimiert werden, um schneller zu sein (es hat auch ein Problem, wenn der letzte Wert in der falschen Phase ist):
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:
