GX-TXT – Software GNU Octave per l’analisi dinamica di HOLD e LED
Questi software GNU Octave sono stati sviluppati durante la caratterizzazione sperimentale della GX-TXT-v3 per elaborare le acquisizioni dell’oscilloscopio relative alla dinamica del nodo HOLD e alla risposta del LED.
La raccolta comprende uno script per l’analisi di una singola acquisizione, due software batch sviluppati per campagne sperimentali differenti e uno script finale per l’analisi globale dei risultati.
Gli script sono ampiamente commentati e sono pubblicati anche come file .m direttamente modificabili. Pur essendo stati sviluppati per la GX-TXT, possono essere adattati ad altri circuiti modificando principalmente la corrispondenza tra i nodi acquisiti, i nomi delle variabili e il parser del file CSV.
Dati di ingresso
Nodi e variabili utilizzati dagli script
Per rendere più semplice l’adattamento del software a un circuito differente, è utile chiarire il significato dei principali nomi utilizzati nel codice. Non è necessario utilizzare gli stessi nomi nel proprio schema: è sufficiente stabilire una corrispondenza tra i nodi del circuito da analizzare e le variabili attese dallo script.
| Nome | Significato |
|---|---|
V_HOLD | Tensione del nodo HOLD, cioè la tensione sul condensatore utilizzato dalla GX-TXT per mantenere temporaneamente attiva l’indicazione. |
N_LED_ARANCIO | Nodo posto tra la resistenza serie RLED e il LED arancione. La sua tensione viene utilizzata per ricavare la corrente del LED. |
VCC | Tensione di alimentazione del ramo LED. Negli script viene stimata dal valore di N_LED_ARANCIO durante il pretrigger, quando il LED è spento. |
P_GAIN | Valore resistivo della regolazione di guadagno utilizzato come metadato della prova. |
P_SENS | Valore resistivo della regolazione di sensibilità. Viene utilizzato anche per raggruppare e confrontare le diverse condizioni sperimentali. |
VGEN | Ampiezza dello stimolo impostato sul generatore. Nella v8 viene indicata esplicitamente come vgen_vpp. |
V_RSENSE | Tensione misurata sulla resistenza di sensing del fotodiodo virtuale. È utilizzata dalla v8 per ricavare direttamente la corrente di stimolo. |
I_SENSE | Corrente di stimolo ricavata dalla tensione su RSENSE. |
numeroImpulsi | Numero di periodi della portante contenuti nel burst applicato al circuito. |
La corrente del LED viene ricavata nel software da:
$$ I_{LED}=\frac{V_{CC}-V_{N\_LED\_ARANCIO}}{R_{LED}} $$
Nelle misure della GX-TXT viene utilizzata:
$$ R_{LED}=680\ \Omega $$
Per la v8 viene inoltre utilizzata la tensione misurata sulla resistenza del fotodiodo virtuale:
$$ I_{SENSE}=\frac{V_{RSENSE}}{R_{SENSE}} $$
con:
$$ R_{SENSE}=51\ \mathrm{k}\Omega $$
Queste relazioni dipendono dalla topologia del circuito utilizzato. Per applicare gli script a un circuito differente occorre quindi verificare soprattutto la definizione dei segnali vHold e vLed e, se necessario, modificare il calcolo di iLed_mA.
Canali utilizzati nelle acquisizioni originali
Anche l’associazione dei canali dell’oscilloscopio è semplicemente una convenzione utilizzata durante le diverse campagne sperimentali.
| Software | Canale LED | Canale HOLD |
|---|---|---|
| Analisi singola v6 | CH3 = N_LED_ARANCIO | CH2 = V_HOLD |
| Batch v7 | CH3 = N_LED_ARANCIO | CH2 = V_HOLD |
| Batch v8 | CH3 = N_LED_ARANCIO | CH4 = V_HOLD |
Non è indispensabile utilizzare questi stessi canali. Ciò che conta è assegnare correttamente alle variabili vLed e vHold le colonne del CSV che contengono i segnali corrispondenti.
Formato CSV dell’oscilloscopio
Gli script sono stati sviluppati utilizzando file CSV esportati da un oscilloscopio Rigol. Il parser presuppone quindi la struttura utilizzata da questo strumento: le informazioni temporali Start e Increment vengono ricavate dall’header e i campioni sono letti come sequenza più due canali analogici.
Un oscilloscopio differente può esportare un CSV con header, numero di colonne, separatori o rappresentazione dell’asse temporale diversi. In questo caso non è necessario modificare l’algoritmo di analisi: normalmente è sufficiente adattare il piccolo blocco di codice che importa il file.
Questo è il blocco della v8 da cercare nella funzione analizza_csv_gxtxt_impulsi:
riga1 = fgetl(fid);
riga2 = fgetl(fid);
campi = strsplit(riga2, ',');
tStart = str2double(campi{4});
dt = str2double(campi{5});
dati = fscanf( ...
fid, ...
'%f,%f,%f,', ...
[3, Inf])';
seq = dati(:,1);
vLed = dati(:,2); % CH3 = N_LED_ARANCIO
vHold = dati(:,3); % CH4 = V_HOLD
t = tStart + seq .* dt;
Questo è il punto principale da modificare per utilizzare il software con il CSV prodotto da un altro oscilloscopio. Alla parte successiva dell’algoritmo servono essenzialmente tre informazioni: il vettore dei campioni HOLD, il vettore dei campioni del nodo LED e il relativo asse temporale.
Nella v7 la struttura è analoga, ma le due colonne vengono assegnate nell’ordine opposto:
seq = dati(:,1);
vHold = dati(:,2);
vLed = dati(:,3);
t = tStart + seq .* dt;
Questa separazione rende relativamente semplice adattare gli script a esportazioni CSV differenti senza intervenire sulle successive procedure di analisi.
È importante chiarire la relazione tra GXTXT_batch_v7 e GXTXT_batch_impulsi_v8. Nonostante la numerazione possa suggerire il contrario, la v8 non deve essere considerata semplicemente l’evoluzione o la nuova versione della v7.
I due programmi condividono una parte importante della procedura di analisi HOLD/LED, ma sono stati sviluppati per campagne sperimentali differenti e utilizzano convenzioni, metadati e formati di ingresso non perfettamente coincidenti.
La v7 è il software utilizzato per la campagna originale sulla dinamica di HOLD e costituisce anche il riferimento per l’attuale GXTXT_analisi_globale_v1. La v8 è invece il batch utilizzato per la successiva campagna nella quale viene variato il numero di impulsi; introduce inoltre V_RSENSE, I_SENSE e altri controlli specifici di quella serie di misure.
Per questo motivo entrambe le versioni vengono mantenute e pubblicate. La numerazione documenta l’ordine storico con cui gli script sono stati sviluppati, ma non implica che la v8 sostituisca la v7.
I programmi
GXTXT_singola — analisi di una singola acquisizione
Lo script per la singola acquisizione è utile durante lo sviluppo e la verifica del metodo di analisi. Permette di lavorare direttamente su una misura, impostando manualmente i metadati della prova, e produce i risultati numerici, la tabella della scarica di HOLD e i grafici relativi alla dinamica HOLD → LED.
| Versione | Descrizione | Download | TODO |
|---|---|---|---|
| v6 | Analisi completa di una singola acquisizione HOLD/LED. | GXTXT_singola_v6.m | — |
GXTXT_batch — analisi automatica della campagna
Il software batch automatizza la stessa procedura su una serie di acquisizioni descritte mediante un file indice. Ogni prova viene elaborata separatamente e i risultati vengono infine raccolti nel file risultati_batch.csv.
Sono disponibili due implementazioni del software batch. La v7 è stata utilizzata per la campagna originale sulla dinamica di HOLD ed è il formato atteso dall’attuale software di analisi globale. La v8 è stata sviluppata per la diversa campagna con numero di impulsi variabile e utilizza metadati e convenzioni in parte differenti. I due programmi condividono il nucleo dell’analisi HOLD/LED, ma la v8 non sostituisce la v7.
| Versione | Descrizione | Download | TODO / note |
|---|---|---|---|
| v7 | Versione utilizzata per la campagna HOLD/LED originale. | GXTXT_batch_v7.m | — |
| v8 | Batch per la campagna con numero di impulsi variabile. | GXTXT_batch_impulsi_v8_CH3_CH4.m | Differenze v8 / v7 |
GXTXT_analisi_globale — analisi globale della campagna
Il terzo software utilizza i risultati prodotti dal batch per costruire le caratteristiche globali della campagna sperimentale. Tra queste rientrano la relazione tra corrente del LED e tensione HOLD, il tempo di accensione del LED in funzione del massimo raggiunto da HOLD e le famiglie di curve ottenute variando la sensibilità e lo stimolo applicato.
La versione attuale dello script è stata sviluppata per il file risultati_batch.csv prodotto dalla v7 del software batch. In particolare utilizza il campo vgen_V e la corrispondenza sperimentale tra VGEN e I_SENSE adottata nella campagna originale. Non viene quindi presentata come direttamente compatibile con l’output della v8.
| Versione | Descrizione | Download | TODO |
|---|---|---|---|
| v1 | Analisi globale dei risultati prodotti dal batch v7. | GXTXT_analisi_globale_v1.m | — |
Manuale d’uso
Per utilizzare i software senza dover ricostruire il flusso di lavoro direttamente dal codice sorgente è disponibile un manuale operativo dedicato.
La guida descrive la preparazione delle acquisizioni, il formato dei file CSV, la corrispondenza tra i nodi del circuito e le variabili utilizzate dagli script, l’impiego delle versioni singola e batch, la struttura dei file indice e l’interpretazione dei principali file di output.
Sono inoltre riportate indicazioni pratiche per adattare il parser a oscilloscopi differenti, utilizzare gli script con circuiti diversi dalla GX-TXT e riconoscere i problemi più comuni durante l’elaborazione.
Il manuale è volutamente orientato all’utilizzo del software; la descrizione dettagliata degli algoritmi di analisi viene trattata separatamente.
Algoritmi di analisi dinamica HOLD e LED
I software sono organizzati su tre livelli. Il primo estrae da una singola acquisizione le grandezze caratteristiche della dinamica HOLD → LED. Il secondo applica automaticamente la stessa procedura a un’intera campagna sperimentale, associando a ogni acquisizione le condizioni della prova. Il terzo lavora sui risultati già estratti e costruisce le caratteristiche globali del sistema.
La separazione è intenzionale: l’analisi della forma d’onda viene eseguita una sola volta per ogni acquisizione, mentre confronti, raggruppamenti e fit globali vengono effettuati successivamente sui risultati numerici. In questo modo l’elaborazione di una singola traccia e l’interpretazione dell’intera campagna rimangono due problemi distinti.
GXTXT_singola_v6 — algoritmo di analisi di una singola acquisizione HOLD/LED
Ricostruzione dell’asse temporale
Il punto di partenza è il CSV esportato dall’oscilloscopio. Il file Rigol utilizzato nello sviluppo non memorizza necessariamente il tempo completo per ogni campione: nell’header sono presenti il tempo iniziale dell’acquisizione e l’intervallo temporale tra due campioni consecutivi.
Indicando con n_i il numero progressivo del campione, con t_Start il tempo iniziale e con Δt l’incremento temporale, lo script ricostruisce:
$$ t_i=t_{Start}+n_i\Delta t $$
e quindi:
$$ F_s=\frac{1}{\Delta t} $$
Da questo punto in avanti l’algoritmo lavora sui tre vettori tempo, V_HOLD e N_LED_ARANCIO e non dipende più dalla struttura interna del CSV.
Determinazione automatica delle condizioni di riposo
Prima di analizzare la risposta al burst è necessario conoscere la condizione iniziale del circuito. Lo script utilizza preferenzialmente il tratto di acquisizione precedente a -0,1 s rispetto al trigger. Se questo intervallo non è disponibile utilizza una porzione iniziale dell’acquisizione.
Per ciascun segnale viene utilizzata la mediana, invece della media:
$$ V_{HOLD,base}=\operatorname{median}(V_{HOLD}) $$
$$ V_{CC}\simeq\operatorname{median}(V_{N\_LED}) $$
La mediana è poco sensibile a singoli campioni anomali e permette quindi di ottenere una stima stabile del livello di riposo. Nel circuito GX-TXT, durante il pretrigger il LED è spento e il nodo N_LED_ARANCIO si trova praticamente alla tensione di alimentazione del ramo; per questo motivo tale livello viene utilizzato anche come stima di VCC.
Ricostruzione della corrente del LED
Conoscendo VCC e la resistenza serie del LED, la corrente viene ricavata dalla tensione misurata sul nodo N_LED_ARANCIO:
$$ I_{LED}(t)=\frac{V_{CC}-V_{N\_LED}(t)}{R_{LED}} $$
con:
$$ R_{LED}=680\ \Omega $$
Eventuali piccoli valori negativi prodotti dal rumore o dall’incertezza sulla stima di VCC vengono riportati a zero. In questo modo lo script trasforma una tensione facilmente acquisibile con l’oscilloscopio in una grandezza direttamente legata allo stato del LED.
Individuazione del massimo di HOLD
Viene quindi individuato il massimo della tensione HOLD e il relativo istante:
$$ V_{HOLD,max}=\max V_{HOLD}(t) $$
L’istante corrispondente, tHoldMax, rappresenta il passaggio tra la fase di carica prodotta dal burst e la successiva evoluzione della scarica. È quindi utilizzato come riferimento per le elaborazioni successive.
Trasformazione della scarica in una tabella a livelli di tensione
La scarica di HOLD non viene analizzata utilizzando semplicemente tutti i campioni grezzi. Lo script costruisce invece una serie di livelli di tensione distanziati di:
$$ \Delta V_{HOLD}=0,10\ \mathrm{V} $$
partendo dal massimo misurato e scendendo fino a una tensione poco superiore alla baseline. Per ogni livello viene ricercato il primo attraversamento durante la scarica.
Poiché il livello desiderato cade normalmente tra due campioni consecutivi, l’istante di attraversamento viene raffinato mediante interpolazione lineare:
$$ t_{cross}=t_1+ \frac{V_{target}-V_1}{V_2-V_1} \left(t_2-t_1\right) $$
Nello stesso istante viene interpolata anche la tensione del nodo LED e viene quindi calcolata I_LED.
Il risultato è una tabella nella forma:
V_HOLD → tempo → N_LED → I_LED
Questa rappresentazione è particolarmente utile perché rende confrontabili acquisizioni con durate e frequenze di campionamento differenti: la scarica viene descritta attraverso livelli fisici di tensione comuni anziché attraverso milioni di campioni grezzi.
Fit esponenziale della scarica HOLD
Per caratterizzare la parte lenta della scarica lo script assume come modello di lavoro:
$$ V_{HOLD}(t)=V_{HOLD,base} +A\,e^{-\frac{t-t_0}{\tau}} $$
dove t0 coincide con l’istante del massimo di HOLD.
Sottraendo la baseline:
$$ V_{HOLD}(t)-V_{HOLD,base} =A\,e^{-\frac{t-t_0}{\tau}} $$
e applicando il logaritmo:
$$ \ln\!\left(V_{HOLD}-V_{HOLD,base}\right) = \ln A-\frac{t-t_0}{\tau} $$
il problema viene trasformato in un fit lineare. Se la retta ottenuta ha coefficiente angolare m:
$$ \tau=-\frac{1}{m} $$
mentre:
$$ A=e^q $$
con q intercetta della regressione.
Lo script calcola inoltre R² confrontando il modello esponenziale ricostruito con i livelli HOLD utilizzati nel fit. Il valore di R² non dimostra che il circuito sia un RC ideale: indica soltanto quanto bene quel modello descrive quella porzione della scarica.
Capacità apparente
A partire dalla costante di tempo viene anche calcolata una capacità equivalente assumendo come riferimento una resistenza di 100 kΩ:
$$ C_{app}=\frac{\tau}{100\ \mathrm{k}\Omega} $$
Nel codice questa grandezza è esplicitamente denominata capacità apparente. Non rappresenta una misura diretta del condensatore montato sul circuito: è il valore che produrrebbe la costante di tempo osservata se la scarica fosse determinata unicamente dalla resistenza assunta nel calcolo.
Perché lo spegnimento del LED viene cercato tramite la derivata
Per stabilire quando il LED termina realmente la propria transizione sarebbe possibile scegliere una tensione arbitraria sul nodo N_LED_ARANCIO. Questo, però, renderebbe il risultato dipendente dalla soglia scelta.
Lo script utilizza invece la forma della transizione. Quando il LED si spegne, la sua corrente diminuisce e N_LED_ARANCIO risale verso VCC. La transizione produce quindi un lobo positivo ben riconoscibile nella derivata:
$$ \frac{dV_{N\_LED}}{dt} $$
L’obiettivo dell’algoritmo non è quindi individuare una particolare tensione del LED, ma identificare temporalmente il principale evento dinamico associato al suo spegnimento.
Riduzione del rumore prima della derivata
Calcolare direttamente la derivata dei campioni dell’oscilloscopio amplificherebbe fortemente il rumore. Per questo motivo vengono eseguite due operazioni successive.
Prima i campioni vengono raggruppati in blocchi temporali da 1 ms e sostituiti con il loro valore medio:
$$ \bar{V}_k= \frac{1}{N} \sum_{i=1}^{N}V_i $$
Successivamente la pendenza viene stimata su una finestra locale di 50 ms mediante regressione lineare.
In una finestra centrata, indicando con x_j i tempi rispetto al centro della finestra, la pendenza utilizzata dallo script equivale a:
$$ m= \frac{\sum_j x_jV_j} {\sum_j x_j^2} $$
Questo metodo produce una stima della derivata molto più stabile rispetto alla semplice differenza tra due campioni consecutivi.
Individuazione del lobo principale
La ricerca viene eseguita soltanto dopo il massimo di HOLD. In questa regione viene individuato il massimo positivo della derivata:
$$ D_{max}= \max\left(\frac{dV_{N\_LED}}{dt}\right) $$
L’istante corrispondente viene denominato tLedPeak e rappresenta il punto di massima velocità della transizione del LED.
Non coincide necessariamente con l’inizio o con la fine dello spegnimento: rappresenta il centro dinamicamente più evidente dell’evento e viene utilizzato come punto di partenza per cercarne i due estremi.
Stima robusta del rumore della derivata
Per distinguere il lobo reale dalle piccole variazioni di fondo viene analizzata una regione precedente al massimo della derivata. Il livello centrale del fondo viene stimato con la mediana:
$$ \mu_D=\operatorname{median}(D) $$
La dispersione viene valutata tramite la Median Absolute Deviation:
$$ MAD= \operatorname{median}\left(|D-\mu_D|\right) $$
e convertita in una stima equivalente della deviazione standard:
$$ \sigma_D\simeq1,4826\cdot MAD $$
Il vantaggio rispetto alla deviazione standard calcolata direttamente è una minore sensibilità a picchi isolati o campioni anomali presenti nel tratto utilizzato come fondo.
Soglia adattiva della transizione
La soglia utilizzata per delimitare il lobo non deriva da un solo criterio. Lo script calcola:
$$ D_{noise}=\mu_D+5\sigma_D $$
e contemporaneamente:
$$ D_{rel}=0,10D_{max} $$
La soglia definitiva è:
$$ D_{th}= \max\left(0,\ D_{noise},\ D_{rel}\right) $$
Questa scelta combina due esigenze. Il termine basato sul rumore impedisce di riconoscere come transizione semplici oscillazioni del fondo; il termine pari al 10% del massimo impedisce invece che, in una misura molto pulita, una soglia estremamente bassa allarghi artificialmente il lobo.
Inizio e fine della transizione
Una singola intersezione con la soglia potrebbe essere causata dal rumore. Per questo lo script richiede che la derivata rimanga sotto soglia per un intervallo continuo di 30 ms.
Partendo dal massimo del lobo, la ricerca procede all’indietro per determinare l’inizio della transizione e in avanti per determinarne la fine.
Si ottengono quindi tre istanti caratteristici:
tLedStart — inizio del lobo principale;
tLedPeak — massima velocità della transizione;
tLedEnd — termine del lobo principale.
La durata della transizione è:
$$ T_{trans}=t_{LedEnd}-t_{LedStart} $$
Poiché nelle acquisizioni utilizzate il trigger coincide con l’inizio del burst, il tempo di accensione del LED viene definito come:
$$ T_{LED}=t_{LedEnd} $$
Collegamento tra dinamica LED e tensione HOLD
Una volta determinati i tre istanti della transizione, lo script interpola la traccia HOLD negli stessi punti. È quindi possibile associare direttamente a inizio, massima velocità e fine dello spegnimento:
V_HOLD, N_LED e I_LED.
Questo passaggio è importante perché consente di passare da una semplice misura temporale alla relazione fisica tra lo stato della rete HOLD e la risposta del LED.
Due scale temporali per la derivata di HOLD
La tensione HOLD contiene fenomeni che avvengono su scale temporali molto diverse: la carica iniziale è rapida, mentre la scarica può durare secondi. Una sola finestra di derivazione non sarebbe adatta a entrambe.
Lo script calcola quindi due rappresentazioni separate:
| Analisi | Media a blocchi | Finestra della pendenza | Scopo |
|---|---|---|---|
| HOLD rapida | 0,10 ms | 0,50 ms | Osservare la fase di carica prodotta dal burst |
| HOLD lenta | 5 ms | 100 ms | Osservare la scarica senza amplificare il rumore |
Non si tratta di due modelli differenti del circuito, ma della stessa tecnica di stima della pendenza applicata con risoluzioni temporali adeguate ai due fenomeni.
GXTXT_batch_v7 e GXTXT_batch_impulsi_v8 — algoritmi di analisi batch
Dal singolo esperimento alla campagna
Il software batch non introduce un secondo metodo di misura completamente indipendente. Il nucleo dell’analisi HOLD → LED deriva direttamente dall’algoritmo sviluppato per la singola acquisizione.
La differenza fondamentale è l’architettura:
file indice → metadati della prova → analisi CSV → risultati della prova → master della campagna
In questo modo le condizioni sperimentali non devono più essere modificate manualmente nel sorgente per ogni acquisizione. Ogni riga dell’indice descrive una prova e diventa una riga del dataset finale.
Separazione tra metadati e forma d’onda
Il file CSV dell’oscilloscopio contiene la forma d’onda, ma normalmente non contiene informazioni come P_GAIN, P_SENS, ampiezza dello stimolo o numero di impulsi. Il file indice svolge quindi la funzione di collegamento tra il dato acquisito e la condizione sperimentale che lo ha prodotto.
La v7 utilizza:
P_GAIN, P_SENS, VGEN, file CSV
mentre la v8 estende la descrizione a:
P_GAIN, P_SENS, VGEN, V_RSENSE, numero di impulsi, file CSV.
La scelta consente di mantenere invariato il file originale dell’oscilloscopio e di costruire sopra di esso un livello strutturato di metadati.
Perché i parametri di analisi restano comuni alla campagna
Nel batch i parametri fondamentali dell’algoritmo vengono definiti una sola volta e utilizzati per tutte le acquisizioni: larghezza dei bin, finestra della derivata, soglia relativa, numero di sigma e durata minima di stabilità.
Questa scelta è essenziale per un confronto sperimentale. Se il criterio di riconoscimento del LED venisse modificato da una prova all’altra, una parte delle differenze osservate potrebbe essere introdotta dall’elaborazione stessa anziché dal circuito.
Nelle versioni attuali vengono utilizzati, tra gli altri:
| Parametro | Valore |
|---|---|
| Media LED | 1 ms |
| Finestra derivata LED | 50 ms |
| Soglia relativa | 10% del massimo |
| Soglia rumore | 5 σ |
| Stabilità richiesta | 30 ms |
| Escursione minima N_LED | 0,20 V |
Controllo preliminare dell’esistenza di una vera transizione LED
Prima di applicare il riconoscimento mediante derivata, le versioni batch verificano che la traccia N_LED presenti un’escursione sufficientemente grande:
$$ \Delta V_{LED}= V_{LED,max}-V_{LED,min} $$
La ricerca viene tentata solo se:
$$ \Delta V_{LED}\geq0,20\ \mathrm{V} $$
Questo valore non è la soglia elettrica di spegnimento del LED. È semplicemente un controllo preliminare per evitare che rumore o piccole variazioni della baseline vengano sottoposti al riconoscimento del lobo come se fossero una vera transizione.
Una prova senza accensione del LED è comunque un risultato
Il batch distingue tra assenza di una transizione LED ed errore di elaborazione. Se il circuito non raggiunge la condizione necessaria per mantenere acceso il LED, ledTransitionValid rimane falso e le grandezze che richiedono una transizione assumono valore non disponibile.
Questo comportamento è importante in una caratterizzazione: una prova sotto soglia non deve essere scartata come acquisizione errata, perché rappresenta comunque un’informazione sperimentale sul sistema.
Il ruolo della v7
La v7 trasforma l’algoritmo della singola acquisizione in una procedura automatica e ripetibile. Ogni CSV viene analizzato in una propria cartella, mentre risultati_batch.csv raccoglie una riga per ogni condizione sperimentale.
Il ciclo è protetto prova per prova: se un’acquisizione genera un errore, il problema viene registrato nello stato del batch e il programma continua con la prova successiva. In questo modo una singola misura problematica non invalida l’intera campagna.
Evoluzione della v8: corrente di stimolo ricavata da V_RSENSE
La v8 aggiunge al file indice la tensione misurata sulla resistenza di sensing del fotodiodo virtuale. La corrente associata allo stimolo viene quindi determinata direttamente:
$$ I_{SENSE}= \frac{V_{RSENSE}}{R_{SENSE}} $$
con:
$$ R_{SENSE}=51\ \mathrm{k}\Omega $$
Il risultato viene convertito in microampere e memorizzato insieme alla prova. Rispetto al solo valore nominale impostato sul generatore, questa grandezza rappresenta un’informazione più direttamente legata allo stimolo effettivamente applicato al circuito di prova.
Numero di impulsi e durata del burst nella v8
Nella v7 il numero di impulsi è un parametro comune all’intera campagna. Nella v8 diventa invece un attributo di ogni singola acquisizione.
La durata teorica del burst viene calcolata come:
$$ T_{burst}= \frac{N_{impulsi}}{f_{carrier}} $$
Questo permette di utilizzare lo stesso batch per una serie nella quale l’energia complessivamente trasferita al nodo HOLD viene variata modificando direttamente il numero di periodi della portante.
Ricerca del massimo HOLD solo dopo il trigger nella v8
Nella v7 il massimo di HOLD viene ricercato sull’intera acquisizione. La v8 restringe invece la ricerca ai campioni con:
$$ t\geq0 $$
La modifica evita che, in una traccia quasi piatta o con variazioni molto piccole, un campione del pretrigger venga erroneamente scelto come massimo e diventi il riferimento temporale dell’intera analisi.
Fit HOLD validato nella v8
La v8 mantiene lo stesso modello esponenziale della v7, ma separa esplicitamente il concetto di prova valida da quello di fit disponibile.
Prima di accettare il fit vengono verificati, tra gli altri, questi requisiti:
– almeno tre punti utilizzabili;
– tempi finiti e successivi al massimo di HOLD;
– valori di tensione finiti;
– coefficiente angolare negativo nel dominio logaritmico;
– τ positivo e finito;
– ampiezza A finita.
Soltanto se queste condizioni sono soddisfatte viene posto:
holdFitValid = true.
Se la finestra acquisita è troppo corta, HOLD è praticamente piatto oppure la scarica non è descrivibile con sufficiente informazione, la prova rimane utilizzabile e i parametri del fit vengono semplicemente lasciati come non disponibili.
Robustezza della media a blocchi e della derivata nella v8
La v8 aggiunge controlli anche alle funzioni numeriche ausiliarie. Prima di costruire i blocchi o la finestra di regressione vengono verificati il numero di campioni, la validità di Δt e la possibilità effettiva di costruire una finestra di almeno tre punti.
Se i dati non sono sufficienti, la funzione restituisce un risultato vuoto anziché forzare un calcolo numericamente privo di significato.
Questa modifica non cambia il metodo matematico della derivata: rende semplicemente esplicite le condizioni nelle quali quel metodo può essere applicato.
Separazione tra risultato numerico e grafico nella v8
Nella v8 il master numerico viene aggiornato prima della generazione dei grafici. L’elaborazione grafica viene poi eseguita in un blocco separato.
Questa scelta distingue due categorie di problema:
ERROR_ANALYSIS — non è stato possibile ottenere il risultato numerico;
OK_PLOT_ERROR — il risultato numerico è valido e salvato, ma uno o più grafici non sono stati generati;
OK — analisi e grafici completati.
Dal punto di vista della misura è una distinzione importante: un problema del sistema grafico non deve provocare la perdita di un risultato sperimentale già calcolato correttamente.
Il master come interfaccia verso le elaborazioni successive
Il risultato principale del batch non è soltanto l’insieme dei grafici, ma il file master. Ogni riga rappresenta una condizione sperimentale e contiene sia i parametri della prova sia le grandezze estratte dalla forma d’onda.
Il batch svolge quindi anche una funzione di riduzione del dato: milioni di campioni vengono trasformati in un insieme limitato di parametri confrontabili, mantenendo comunque nelle cartelle delle singole prove le tabelle e i dati intermedi necessari per eventuali verifiche.
GXTXT_analisi_globale_v1 — algoritmo di analisi globale della campagna
Un livello di analisi differente
Il terzo software non torna alle forme d’onda originali per ripetere l’analisi temporale. Lavora principalmente sul master prodotto dal batch e sulle tabella_hold.csv già generate per le singole prove.
Il suo compito è quindi diverso:
risultati delle singole prove → dataset comune → relazioni globali → fit e famiglie di curve.
La versione attuale è stata progettata esplicitamente per il formato prodotto dalla v7 del batch.
Lettura del master per nome delle colonne
Il programma legge l’intestazione di risultati_batch.csv e ricerca le colonne necessarie tramite il loro nome, ad esempio:
p_gain_ohm, p_sens_ohm, vgen_V, VholdMax_V, ledTransitionValid e tempoLedAcceso_s.
Questo evita di dipendere rigidamente dalla posizione numerica delle colonne, ma rende naturalmente necessaria la presenza dei nomi previsti dalla v7.
Normalizzazione delle condizioni sperimentali
Prima dei confronti, piccole resistenze residue di P_SENS inferiori a 10 Ω vengono ricondotte alla posizione nominale:
$$ P_{SENS}=0 $$
La normalizzazione serve a raggruppare sotto la stessa condizione nominale misure che, nella pratica, possono differire di pochi ohm per la resistenza residua della regolazione.
Conversione dei livelli VGEN in I_SENSE
La campagna originale dispone di quattro livelli di corrente determinati sperimentalmente. Lo script associa quindi i livelli nominali VGEN alle correnti misurate:
| Livello VGEN | I_SENSE |
|---|---|
| 1 | 15,29 µA |
| 2 | 26,27 µA |
| 3 | 36,08 µA |
| 4 | 45,49 µA |
L’algoritmo non esegue un’interpolazione continua: seleziona il livello di calibrazione più vicino e lo accetta soltanto se la differenza dal valore nominale non supera 0,25 V. Altrimenti restituisce un valore non disponibile.
Questa scelta tratta VGEN principalmente come identificatore di un punto di calibrazione già misurato, non come misura diretta della corrente.
Rappresentazione dei casi in cui il LED non si accende
Per costruire le caratteristiche globali, una prova nella quale non è stata riconosciuta una transizione LED viene rappresentata con:
$$ T_{LED}=0 $$
quando ledTransitionValid è falso oppure il tempo di accensione non è disponibile.
Questa trasformazione viene effettuata nell’analisi globale e non nel batch: il batch conserva infatti la distinzione tra valore misurato e valore non disponibile, mentre l’analisi globale interpreta l’assenza di accensione come punto fisico a tempo zero per costruire le curve della campagna.
Costruzione della caratteristica globale I_LED = f(V_HOLD)
Per questa analisi il solo master non è sufficiente, perché ogni prova contiene molti punti della relazione tra HOLD e corrente LED. Il programma legge quindi tutte le tabella_hold.csv presenti nelle cartelle del batch e concatena le coppie:
$$ (V_{HOLD},I_{LED}) $$
ottenute dalle diverse acquisizioni.
Viene inoltre aggiunto il punto fisico:
$$ (0\ \mathrm{V},0\ \mathrm{mA}) $$
Binning della tensione HOLD
I valori provenienti dalle differenti acquisizioni non coincidono necessariamente in modo perfetto. La tensione HOLD viene quindi quantizzata in intervalli da 0,10 V:
$$ V_{bin}= \operatorname{round} \left( \frac{V_{HOLD}}{0,10} \right) \cdot0,10 $$
Per ogni intervallo vengono calcolati:
– mediana di I_LED;
– valore minimo;
– valore massimo;
– numero di punti disponibili.
La mediana fornisce una curva centrale poco influenzata da singoli punti anomali, mentre minimo, massimo e numero di campioni conservano informazioni sulla dispersione presente nelle diverse acquisizioni.
Perché T_LED viene confrontato con V_HOLD,max
Il massimo raggiunto da HOLD rappresenta lo stato iniziale dal quale parte la successiva scarica. Se la scarica fosse approssimativamente esponenziale e lo spegnimento avvenisse intorno a un determinato livello caratteristico, il tempo necessario a raggiungerlo dovrebbe dipendere dal logaritmo della tensione iniziale.
Partendo idealmente da:
$$ V(t)=V_{max}e^{-t/\tau} $$
e imponendo un livello finale V0:
$$ V_0=V_{max}e^{-T/\tau} $$
si ottiene:
$$ T=\tau\ln\left(\frac{V_{max}}{V_0}\right) $$
Questo fornisce la motivazione per il modello utilizzato dal software.
Fit logaritmico T_LED = f(V_HOLD,max)
Il programma utilizza soltanto i casi con LED effettivamente acceso:
$$ T_{LED}>0 $$
e:
$$ V_{HOLD,max}>0 $$
Il fit viene eseguito nella forma:
$$ T_{LED} = a\ln(V_{HOLD,max})+b $$
che può essere riscritta come:
$$ T_{LED} = a\ln\left( \frac{V_{HOLD,max}}{V_0} \right) $$
con:
$$ V_0=e^{-b/a} $$
Il coefficiente a assume dimensionalmente il ruolo di una costante temporale efficace, mentre V0 è un parametro caratteristico del fit. Non va interpretato automaticamente come una soglia elettrica rigida del circuito.
Anche in questo caso viene calcolato R² per quantificare quanto bene il modello descrive i punti sperimentali utilizzati.
Perché il fit non comprende i punti con T_LED = 0
I punti a tempo zero sono importanti per mostrare le condizioni nelle quali il LED non si accende, ma non appartengono necessariamente alla stessa relazione logaritmica dei casi in cui è avvenuta una vera fase di mantenimento.
Per questo motivo vengono visualizzati nel dataset globale ma esclusi dal fit. Il modello viene costruito soltanto sulla regione in cui esiste effettivamente un tempo di accensione misurabile.
Famiglie T_LED = f(I_SENSE) al variare di P_SENS
L’ultima elaborazione cambia punto di vista. Invece di utilizzare HOLD come variabile indipendente, raggruppa le prove in base al valore di P_SENS e studia:
$$ T_{LED}=f(I_{SENSE}) $$
Per ciascun valore di P_SENS i punti vengono ordinati per corrente crescente, ottenendo una famiglia di caratteristiche che mostra come la regolazione di sensibilità modifichi la risposta dello strumento allo stimolo.
Interpolazione PCHIP
Se una serie contiene almeno tre punti e non è completamente piatta, il programma utilizza un’interpolazione PCHIP per tracciare una curva continua tra le misure.
È importante distinguere questa operazione dal fit precedente: PCHIP non introduce qui un modello fisico della GX-TXT e non stima parametri del circuito. Serve soltanto a costruire una rappresentazione continua e regolare tra punti sperimentali ordinati.
La scelta di un’interpolazione shape-preserving limita inoltre le oscillazioni artificiali che potrebbero comparire utilizzando polinomi globali di ordine elevato.
Tre livelli di informazione
Nel complesso i tre software lavorano quindi su tre rappresentazioni progressivamente più compatte dello stesso esperimento:
1. Forma d’onda
milioni di campioni acquisiti dall’oscilloscopio.
2. Parametri della singola prova
V_HOLD,max, τ, I_LED, tempi della transizione, T_LED e relative grandezze.
3. Caratteristiche della campagna
I_LED(V_HOLD), T_LED(V_HOLD,max) e famiglie T_LED(I_SENSE).
Questa struttura evita di utilizzare direttamente le forme d’onda grezze per ogni confronto globale e permette allo stesso tempo di conservare, per ciascuna misura, i dati intermedi necessari per verificare come ogni parametro è stato ottenuto.
Licenza
I software GNU Octave pubblicati in questa pagina sono distribuiti con licenza GNU General Public License versione 3 o successiva (GPL-3.0-or-later).
La licenza consente di utilizzare, studiare, modificare e ridistribuire il codice sorgente, anche in versioni derivate, nel rispetto dei termini previsti dalla GNU GPL. In particolare, eventuali versioni distribuite che incorporano o modificano questi programmi devono mantenere una licenza compatibile e rendere disponibile il relativo codice sorgente.
Gli script vengono pubblicati principalmente come strumenti sperimentali e didattici, con l’obiettivo di permettere la verifica dei risultati, il riutilizzo delle procedure di analisi e l’adattamento ad acquisizioni o circuiti differenti.