<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola,
Tengo trazas de señales de proceso e identifico trazas de pulso contra formas de obleas aleatorias. En la gráfica a continuación, solo los valores de señal con puntos de muestreo adyacentes tienen un valor distinto de cero, pero si 1 punto de muestreo tiene valores distintos de cero, se descartarán.
En segundo lugar, solo se deben contar las trazas de pulso con un umbral por encima de un cierto valor, digamos 1.5 como aquí.
Estoy buscando desarrollar un script simple para esto. La señal, las muestras y los rastros se almacenan como columnas.

Sin duda, hay formas más eficientes de hacer esto, pero el código a continuación puede ayudarlo a comenzar:
NombresDefaultToHere ( 1 ) ;
// Función para contar 'señales' en un vector de datos
countSignals =
Función ({ vec , val } , { Predeterminado local } ,
// Localiza puntos por encima del valor 'val'
plusPos = Loc ( vec > val ) ;
ceropos = Loc ( vec <= val ) ;
// Recodificar puntos apropiadamente
vec El plusPos ] = 1 ;
vec El ceropos ] = 0 ;
// Cuente el número de señales (ejecuciones de dos o más valores de +1): Inicializar variables
nSignals = 0 ;
isSignal = 0 ;
anterior = vec El 1 ] ;
// Recorre los elementos de vec comenzando con el segundo. . .
por ( mi = 2 , mi <= NRow ( vec ) , mi ++,
Si ( ! isSignal ,
// Si no estamos ya en el 'medio' de una señal, comienza uno
Si ( vec El mi ] == anterior Y anterior == 1 , isSignal = 1 ) ,
// Si ya estamos en el 'medio' de una señal, ¿ha llegado a su fin? Si es así cuente, y reinicie.
Si ( vec El mi ] == 0 , nSignals ++; isSignal = 0 )
) ;
// Si estamos al final de vec y estamos en el "medio" de una señal, todavía tenemos que contarla
Si ( mi == NRow ( vec ) Y isSignal , nSignals ++ ) ;
// Actualizar el valor 'anterior' listo para la próxima iteración
anterior = vec El mi ] ;
) ;
// Devuelve el número de señales
nSignals ;
) ;
/ *
// Este vector de prueba tiene cuatro ejecuciones (con un umbral de 0.5):
v = [0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1];
Imprimir (countSignals (v, 0.5));
* /
// Hacer algunos datos ficticios. . .
norte = 100 ;
datos = Aleatoria shuffle ( J ( norte / 2 , 1 , RandomNormal ( 4 , 1 )) | / J ( norte / 2 , 1 , 0 )) ;
dt = Asable ( datos ) ;
dt << escoger un nombre ( "Datos de prueba para el conteo de señales" ) ;
Columna ( dt , "Col1" ) << escoger un nombre ( "Valor" ) ;
// Plotear. . .
Nueva ventana ( "Este dato tiene" || Carbonizarse ( countSignals ( datos , 1.0 )) || "Señales" ,
dt << Generador de gráficos (
Mostrar panel de control ( 0 ) ,
Mostrar leyenda ( 0 ) ,
Variables ( X ( Columna de transformación ( "Fila" , Fórmula ( Fila () ) ) ) , Y ( : Valor ) ) ,
Elementos ( Línea ( X , Y , Leyenda ( 4 ) ) , Puntos ( X , Y , Leyenda ( 5 ) ) ) ,
SendToReport (
Envío ( {} , "Valor" , ScaleBox , { Añadir línea de referencia ( 1 , "Sólido" , "Rojo" , "" , 1 )} )
)
) ;
) ;