<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut,
J'ai des traces de signal de traitement et identifie des traces d'impulsion par rapport à des formes aléatoires de plaquettes. Dans le graphique ci-dessous, seules les valeurs de signal avec des points d'échantillonnage adjacents ont une valeur non nulle, mais si un point d'échantillonnage a des valeurs non nulles, il doit être ignoré.
Deuxièmement, seules les traces d'impulsions avec un seuil supérieur à une certaine valeur, disons 1,5 comme ici, doivent être comptées.
Je cherche à développer un script simple pour cela. Le signalv, les échantillons et les traces sont stockés sous forme de colonnes.

Il existe sans doute des moyens plus efficaces de le faire, mais le code ci-dessous peut vous aider à démarrer:
NamesDefaultToHere ( 1 ) ;
// Fonction permettant de compter les 'signaux' dans un vecteur de données
nombre de signaux =
Une fonction ({ vec , val } , { Local par défaut } ,
// localiser les points au-dessus de la valeur 'val'
plusPos = Loc ( vec > val ) ;
zeroPos = Loc ( vec <= val ) ;
// Recode les points de manière appropriée
vec [ plusPos ] = 1 ;
vec [ zeroPos ] = 0 ;
// Compter le nombre de signaux (exécutions d'au moins deux valeurs de +1): Initialise les variables
nSignaux = 0 ;
isSignal = 0 ;
précédent = vec [ 1 ] ;
// Boucle sur les éléments de vec en commençant par le second. . .
Pour ( e = 2 , e <= NRow ( vec ) , e ++,
si ( ! isSignal ,
// Si nous ne sommes pas déjà au 'milieu' d'un signal, commencez-en un
si ( vec [ e ] == précédent Et précédent == 1 , isSignal = 1 ) ,
// Si nous sommes déjà au "milieu" d'un signal, est-ce que cela a pris fin? Si c'est le cas, comptez-le et réinitialisez-le.
si ( vec [ e ] == 0 , nSignaux ++; isSignal = 0 )
) ;
// Si nous sommes à la fin de la VEC et si nous sommes au "milieu" d'un signal, nous avons encore besoin de le compter
si ( e == NRow ( vec ) Et isSignal , nSignaux ++ ) ;
// Mise à jour de la valeur 'précédente' prête pour la prochaine itération
précédent = vec [ e ] ;
) ;
// Retourne le nombre de signaux
nSignaux ;
) ;
/ *
// Ce vecteur de test comporte quatre exécutions (avec un seuil de 0,5):
v = [0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1];
Imprimer (nombre de signaux (v, 0,5));
* /
// Crée quelques données factices. . .
n = 100 ;
Les données = RandomShuffle ( J ( n / 2 , 1 , AléatoireNormal ( 4 , 1 )) | / J ( n / 2 , 1 , 0 )) ;
dt = AsTable ( Les données ) ;
dt << setName ( "Données de test pour le comptage de signaux" ) ;
Colonne ( dt , "Col1" ) << setName ( "Valeur" ) ;
// Trace-le. . .
Nouvelle fenetre ( "Ces données ont" || Carboniser ( nombre de signaux ( Les données , 1,0 )) || "Signaux" ,
dt << Générateur de graphes (
Afficher le panneau de configuration ( 0 ) ,
Afficher la légende ( 0 ) ,
Variables ( X ( Transformer la colonne ( "Rangée" , Formule ( Rangée () ) ) ) , Y ( : Valeur ) ) ,
Éléments ( Ligne ( X , Y , Légende ( 4 ) ) , Points ( X , Y , Légende ( 5 ) ) ) ,
SendToReport (
Envoi ( {} , "Valeur" , ScaleBox , { Ajouter une ligne de référence ( 1 , "Solide" , "Rouge" , "" , 1 )} )
)
) ;
) ;