Problème de déballage de phase unidimensionnelOù commencer? J'ai initialement demandé de l'aide (voir le lien ci-dessous) sur la façon de faire un retournement de couverture à 360 degrés basé sur une valeur de spécification, mais en regardant un peu plus en détail cela ne fonctionnera pas car la phase est terminée. Il existe un processus pour dérouler la phase en une forme continue.
Le processus est le suivant: (en utilisant les valeurs radian)
1) Commencez avec le deuxième échantillon en partant de la gauche dans le signal de phase enveloppé.
2) Calculez la différence entre l'échantillon actuel et son voisin de gauche directement adjacent.
3) Si la différence entre les deux est supérieure à + π, soustrayez 2π de cet échantillon ainsi que de tous les échantillons à sa droite.
4) Si la différence entre les deux est inférieure à -π, ajoutez 2π à cet échantillon ainsi qu'à tous les échantillons à sa droite.
5) Tous les échantillons ont-ils été traités? Si non, revenez à l'étape 2. Si oui, arrêtez
Je recherche de l'aide pour effectuer cette opération et j'ai joint un exemple de tableau de données à titre de référence.
Dans cette table de données, je dois dérouler par: RowCol,: channel,: teststate et refstate.
Merci d'avance
// 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
Tableau de donnéesGraphiqueScriptingRe: Problème de déballage de phase unidimensionnelUne idée de ce à quoi ressemblerait le résultat correct? Quelque chose de similaire à ceci:
Phase enveloppée:

Cela devrait-il être changé?

L'exécution de ce script sera assez lente, mais il peut très probablement être optimisé pour être plus rapide (cela pose également un problème si la dernière valeur est dans une mauvaise phase):
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)}
)
)
);Problème avec le dernier échantillon:

Re: Problème de déballage de phase unidimensionnelC'est un excellent travail @jthi .
(image 1): Je penserais que tant que la courbe a la même forme que les parties / canaux qui n'avaient pas la phase enveloppée, c'est correct. Je vérifierai avec les gens du test.
(image 2): Je pense que la ligne bleue (canal 0) est morte mais les 3 autres canaux ont eu un nombre énorme de phases enveloppées et votre script a fonctionné.
(image 3): Je peux vivre avec ça pour le moment car nous projetons à deux (2) indices moyens et pas le dernier.
Quant à l'optimisation du script, je ne saurais même pas par où commencer. Peut-être que quelqu'un pourrait intervenir sur ce fil avec des suggestions.
Encore une fois, c'est génial et je ne saurais trop vous remercier pour votre aide. Parce que nous déballions arbitrairement la phase, il est possible de filtrer les bonnes pièces. Je ne sais pas si nous envoyions des pièces défectueuses jusqu'à ce que je puisse creuser davantage.
Re: Problème de déballage de phase unidimensionnelJe regarde le script et je l'applique à un autre ensemble de données et je ne pense pas que nous en soyons encore tout à fait là. Je vais devoir réfléchir un peu à celui-ci. C'est proche...