GX-TXT – Analisi e identificazione dei protocolli IR con GNU Octave

Questi programmi GNU Octave sono stati sviluppati durante la caratterizzazione del GX-TXT-v3 per analizzare il segnale IR acquisito sul nodo VIR. Il primo software ricostruisce portante, MARK e SPACE a partire dal CSV esportato dall’oscilloscopio; il secondo utilizza i risultati ottenuti per tentare l’identificazione del protocollo e la ricostruzione dei dati trasmessi.

GXTXT_analisi_VIR_protocollo

Analizza l’acquisizione del nodo VIR, misura la portante IR e ricostruisce la sequenza temporale di MARK e SPACE, generando anche grafici e file intermedi utilizzabili dalle elaborazioni successive.

VersioneDescrizioneDownloadTODO
v2.4Analisi del CSV dell’oscilloscopio, rilevamento automatico del segnale, misura della portante, ricostruzione MARK/SPACE, grafici e file di riepilogo.Download

GXTXT_identifica_protocollo_IR

Utilizza la sequenza MARK/SPACE ricostruita dal primo programma per confrontare il comando acquisito con alcuni protocolli IR noti e, quando possibile, ricostruire bit, byte, indirizzo e comando.

VersioneDescrizioneDownloadTODO
v1Identificazione sperimentale di protocolli IR mediante confronto di portante, temporizzazioni, struttura del frame e numero di bit.Download

Il manuale PDF raccoglie le istruzioni operative per utilizzare i due software GNU Octave, dalla preparazione dell’acquisizione fino all’analisi MARK/SPACE e all’identificazione sperimentale del protocollo IR.

Algoritmi di analisi e identificazione dei protocolli IR

Scopo della catena di elaborazione

I due programmi GNU Octave utilizzano una catena di elaborazione a due livelli. Il primo software parte dai campioni acquisiti dall’oscilloscopio e ricostruisce una rappresentazione temporale del segnale composta da intervalli MARK, nei quali è presente la portante, e SPACE, nei quali la portante è assente. Il secondo software utilizza esclusivamente questa rappresentazione temporale, insieme alla frequenza di portante misurata quando disponibile, per confrontare il comando con diversi protocolli IR noti.

La separazione dei due programmi è intenzionale. Il primo livello dipende dalla forma d’onda acquisita e deve quindi risolvere problemi quali baseline, polarità, rumore, soglia e riconoscimento della portante. Il secondo livello non utilizza più le tensioni originali e lavora solamente sulle durate degli eventi ricostruiti.

La catena può essere rappresentata schematicamente come:

CSV oscilloscopio → normalizzazione del segnale → portante → MARK/SPACE → timing → confronto protocolli → bit e byte

Primo software: GXTXT_analisi_VIR_protocollo

Ricostruzione dell’asse temporale

Il file CSV contiene una sequenza di campioni numerati e i corrispondenti valori di tensione. Nel formato Rigol utilizzato durante lo sviluppo, l’header fornisce anche i parametri Start e Increment. Il software ricostruisce quindi il tempo associato a ogni campione mediante:

$$ t_i = t_{\mathrm{Start}} + n_i \Delta t $$

dove \(n_i\) è il numero progressivo del campione e \(\Delta t\) è l’intervallo temporale tra due campioni consecutivi.

La frequenza di campionamento deriva direttamente da:

$$ F_s = \frac{1}{\Delta t} $$

Il riferimento temporale permette inoltre di conoscere la posizione del trigger \(t=0\). Il programma non deve quindi individuare il trigger analizzando la forma d’onda: utilizza l’informazione temporale fornita dall’oscilloscopio.

Pretest adattivo

Prima di elaborare l’intera acquisizione viene eseguito un pretest adattivo. Lo scopo non è decodificare il comando, ma verificare rapidamente che nella registrazione esista un segnale utilizzabile e ricavare i parametri necessari all’analisi completa.

Nella configurazione automatica della versione 2.4 vengono provate progressivamente quattro finestre attorno al trigger:

Tentativo Prima del trigger Dopo il trigger
15 ms30 ms
210 ms60 ms
320 ms120 ms
440 ms250 ms

Se la prima finestra contiene abbastanza informazione, l’analisi prosegue immediatamente. In caso contrario viene provata automaticamente la finestra successiva. Questo evita di elaborare inutilmente milioni di campioni quando il file non contiene un segnale riconoscibile e permette nello stesso tempo di tollerare una certa distanza temporale tra trigger e trasmissione.

È possibile sostituire la ricerca automatica con una finestra definita manualmente.

Il pretest controlla inoltre che siano disponibili abbastanza campioni numerici validi, elimina eventuali valori NaN o Inf e verifica la regolarità della sequenza dei campioni.

Stima della baseline e del rumore

Per evitare di imporre un valore assoluto di tensione, il software determina automaticamente il livello di riposo del segnale. Quando è disponibile una parte pre-trigger sufficientemente lunga, la baseline viene calcolata come mediana dei campioni precedenti a \(t=0\):

$$ V_0 = \operatorname{median}\left(V_i\right)_{t_i<0} $$

La mediana è stata preferita alla media perché risulta meno sensibile a impulsi isolati, disturbi e valori anomali.

Il rumore viene stimato mediante la Median Absolute Deviation:

$$ MAD = \operatorname{median}\left(\left|V_i-V_0\right|\right) $$

e convertito in una stima equivalente della deviazione standard mediante:

$$ \sigma_n \approx 1.4826 \cdot MAD $$

Questa scelta rende la stima del rumore robusta anche in presenza di pochi campioni anomali.

Riconoscimento automatico della polarità

Il programma non presuppone che la portante produca impulsi positivi o negativi. Dopo aver determinato la baseline vengono misurate entrambe le possibili escursioni:

$$ A_{\mathrm{down}} = V_0 – V_{\min} $$

$$ A_{\mathrm{up}} = V_{\max} – V_0 $$

La direzione avente escursione maggiore viene considerata la polarità utile del segnale.

Successivamente la forma d’onda viene trasformata internamente in un segnale sempre positivo:

$$ s_i = \max\left[0,\;p\left(V_i-V_0\right)\right] $$

dove \(p=+1\) per impulsi verso l’alto e \(p=-1\) per impulsi verso il basso.

Tutta l’elaborazione successiva può quindi utilizzare lo stesso algoritmo indipendentemente dalla polarità elettrica presente nel punto del circuito scelto per la misura.

Calcolo automatico della soglia

La soglia utilizzata per trasformare il segnale analogico in una sequenza logica non è espressa come tensione assoluta. Vengono calcolate due soglie indipendenti.

La prima dipende dall’ampiezza del segnale:

$$ V_{\mathrm{th,signal}} = 0.30\,A $$

La seconda dipende dal rumore misurato:

$$ V_{\mathrm{th,noise}} = 8\,\sigma_n $$

La soglia effettivamente utilizzata è la maggiore delle due:

$$ V_{\mathrm{th}} = \max\left( 0.30\,A,\; 8\,\sigma_n \right) $$

In questo modo un segnale molto pulito viene analizzato con una soglia proporzionale alla propria escursione, mentre in presenza di rumore la soglia viene automaticamente mantenuta sufficientemente lontana dal livello di fondo.

Nella versione attuale il pretest richiede inoltre un’escursione minima di 50 mV e rifiuta una soglia che raggiunga il 90% dell’ampiezza del segnale, condizione che renderebbe poco affidabile il riconoscimento degli impulsi.

Verifica preliminare della portante

Una volta applicata la soglia, il pretest costruisce una sequenza logica e individua i fronti di salita. Le distanze temporali tra fronti consecutivi vengono confrontate con il periodo nominale della portante IR.

Nella versione attuale il riferimento nominale è:

$$ f_{\mathrm{nom}} = 38\,\mathrm{kHz} $$

e quindi:

$$ T_{\mathrm{nom}} = \frac{1}{f_{\mathrm{nom}}} $$

Per il pretest vengono accettati come possibili periodi della portante gli intervalli compresi tra:

$$ 0.5\,T_{\mathrm{nom}} < \Delta t_{\mathrm{fronti}} < 1.5\,T_{\mathrm{nom}} $$

La tolleranza è volutamente molto ampia: il valore di 38 kHz serve come riferimento iniziale e non impone che il segnale abbia esattamente quella frequenza. Il pretest viene considerato valido solamente se vengono trovati almeno alcuni intervalli coerenti con una portante IR.

Individuazione degli impulsi

Superato il pretest, la stessa baseline, polarità e soglia vengono applicate all’intera acquisizione. Ogni campione viene classificato come sopra o sotto soglia:

$$ L_i = \begin{cases} 1 & s_i \geq V_{\mathrm{th}} \\ 0 & s_i < V_{\mathrm{th}} \end{cases} $$

Per individuare i fronti il programma non esegue una scansione campione per campione con un ciclo esplicito, ma utilizza una differenza vettoriale della sequenza logica.

Una transizione:

$$ 0 \rightarrow 1 $$

identifica l’inizio di un impulso, mentre:

$$ 1 \rightarrow 0 $$

ne identifica la fine.

Da queste coppie di fronti vengono ricavati il tempo iniziale, il tempo finale e la larghezza di ciascun impulso della portante.

Misura della frequenza di portante

Il periodo della portante viene stimato utilizzando le distanze tra gli inizi degli impulsi consecutivi:

$$ \Delta T_i = t_{\mathrm{start},i+1}-t_{\mathrm{start},i} $$

Vengono inizialmente selezionati gli intervalli compatibili con il riferimento nominale. Il periodo misurato è poi calcolato mediante la mediana:

$$ T_c = \operatorname{median}\left(\Delta T_i\right) $$

e la frequenza deriva da:

$$ f_c = \frac{1}{T_c} $$

L’uso della mediana riduce l’influenza delle pause tra burst, di eventuali fronti anomali e di singoli errori di soglia.

Viene inoltre calcolata la larghezza mediana degli impulsi:

$$ T_{\mathrm{ON}} = \operatorname{median}\left(t_{\mathrm{fall}}-t_{\mathrm{rise}}+\Delta t\right) $$

da cui viene ricavato un duty-cycle apparente:

$$ D_{\mathrm{app}} = \frac{T_{\mathrm{ON}}}{T_c}\cdot100 $$

Questo valore descrive la forma d’onda presente nel punto in cui è stata effettuata la misura e non deve necessariamente coincidere con il duty-cycle con cui viene pilotato fisicamente il LED IR del trasmettitore.

Ricostruzione dei MARK

Dopo aver riconosciuto i singoli cicli della portante, il programma deve stabilire quali impulsi appartengano allo stesso burst. Per ogni coppia di impulsi consecutivi viene calcolata la pausa:

$$ G_i = t_{\mathrm{start},i+1} – t_{\mathrm{end},i} $$

La versione attuale considera appartenenti allo stesso burst gli impulsi separati da una pausa non superiore a tre periodi della portante:

$$ G_i \leq 3T_c $$

Quando:

$$ G_i > 3T_c $$

viene invece riconosciuto l’inizio di un nuovo burst.

Ogni gruppo di cicli consecutivi costituisce quindi un MARK. Per ciascun MARK vengono memorizzati inizio, fine, durata, numero di cicli della portante e larghezza media degli impulsi contenuti.

Ricostruzione degli SPACE e individuazione del comando

Una volta individuati i MARK, gli SPACE si ottengono direttamente dagli intervalli compresi tra la fine di un MARK e l’inizio del successivo:

$$ T_{\mathrm{SPACE},k} = t_{\mathrm{MARK},k+1,\mathrm{start}} – t_{\mathrm{MARK},k,\mathrm{end}} $$

La sequenza finale assume quindi la forma:

MARK → SPACE → MARK → SPACE → MARK → …

L’inizio del comando viene posto automaticamente in corrispondenza dell’inizio del primo MARK riconosciuto:

$$ t_{\mathrm{command,start}} = t_{\mathrm{MARK},1,\mathrm{start}} $$

mentre la fine coincide con la fine dell’ultimo MARK:

$$ t_{\mathrm{command,end}} = t_{\mathrm{MARK},N,\mathrm{end}} $$

La durata complessiva osservata è quindi:

$$ T_{\mathrm{command}} = t_{\mathrm{command,end}} – t_{\mathrm{command,start}} $$

Questa è la fase in cui il software determina automaticamente la porzione della registrazione effettivamente occupata dalla trasmissione, senza richiedere che il file CSV venga ritagliato manualmente sul comando.

Raggruppamento delle durate ricorrenti

Le durate dei MARK e degli SPACE vengono inoltre raggruppate automaticamente in classi. Questa elaborazione non identifica ancora i bit: serve a evidenziare i tempi ricorrenti presenti nella trasmissione e costituisce uno strumento diagnostico utile prima della decodifica.

Le durate vengono ordinate in senso crescente. Per ogni nuovo valore viene calcolata la mediana del gruppo corrente e definita una tolleranza:

$$ \Delta T_{\mathrm{tol}} = \max\left( 1\,\mu s,\; 0.20\,T_{\mathrm{mediana}} \right) $$

Una nuova durata viene inserita nella stessa classe se:

$$ \left| T_i-T_{\mathrm{mediana}} \right| \leq \Delta T_{\mathrm{tol}} $$

In caso contrario viene aperta una nuova classe.

Per ciascun gruppo vengono infine calcolati media, mediana, minimo, massimo e numero di occorrenze. La mediana è il parametro più utile per riconoscere le temporizzazioni caratteristiche del protocollo senza attribuire troppo peso a singole misure anomale.

File prodotti dal primo algoritmo

Il risultato fondamentale dell’analisi non è la forma d’onda originale ma una descrizione temporale molto più compatta.

File Contenuto
eventi_mark_space.csv Sequenza ordinata di MARK e SPACE con inizio, fine, durata e numero di cicli della portante.
burst.csv Informazioni dettagliate sui singoli burst riconosciuti.
riepilogo_VIR.txt Parametri dell’acquisizione, baseline, polarità, soglia, portante, durata del comando e classi temporali.

Il secondo programma utilizza principalmente eventi_mark_space.csv e, quando disponibile, la frequenza di portante riportata nel riepilogo.

Secondo software: GXTXT_identifica_protocollo_IR

Principio generale del classificatore

Il secondo programma non analizza più i campioni dell’oscilloscopio. Il suo ingresso è la sequenza temporale MARK/SPACE prodotta dal primo software.

Ogni protocollo noto viene descritto mediante un insieme di parametri nominali: frequenza della portante, eventuale header, durata dei MARK, durata degli SPACE, metodo di codifica e numero previsto di bit.

Per ogni protocollo candidato viene calcolato uno score di errore. Più lo score è piccolo, maggiore è la compatibilità tra il segnale acquisito e il modello temporale del protocollo.

Lo score non rappresenta una probabilità statistica. È un indice euristico utilizzato per ordinare i candidati sulla base delle differenze relative tra temporizzazioni misurate e nominali.

Modelli temporali utilizzati

Protocollo Portante Codifica Parametri principali
NEC family 38 kHz Pulse distance Header 9000/4500 µs; MARK 560 µs; SPACE 0 = 560 µs; SPACE 1 = 1690 µs; 32 bit
Samsung 38 kHz Pulse distance Header 4480/4480 µs; MARK 560 µs; SPACE 0 = 560 µs; SPACE 1 = 1680 µs; 32 o 48 bit
Panasonic/Kaseikyo 37 kHz Pulse distance Header 3456/1728 µs; MARK 432 µs; SPACE 0 = 432 µs; SPACE 1 = 1296 µs; 48 bit
Sony SIRC 40 kHz Pulse width Header 2400/600 µs; MARK 0 = 600 µs; MARK 1 = 1200 µs; SPACE = 600 µs; 12, 15 o 20 bit
Philips RC5 36 kHz Biphase Unità temporale nominale 889 µs
Philips RC6 36 kHz Biphase Header 2666/889 µs; unità temporale nominale 444 µs

Ricerca dell’header

Per i protocolli dotati di header il software esamina tutte le coppie consecutive MARK/SPACE presenti nella sequenza.

Per ogni coppia vengono calcolati gli errori relativi:

$$ e_M = \frac{ \left|T_M-T_{M,\mathrm{nom}}\right| }{ T_{M,\mathrm{nom}} } $$

$$ e_S = \frac{ \left|T_S-T_{S,\mathrm{nom}}\right| }{ T_{S,\mathrm{nom}} } $$

L’errore dell’header è:

$$ e_H = \frac{e_M+e_S}{2} $$

Il programma seleziona la coppia con errore minimo. Se anche il miglior candidato presenta:

$$ e_H > 0.65 $$

l’header viene considerato assente e il protocollo candidato riceve una forte penalizzazione.

Decodifica dei protocolli pulse-distance

Nei protocolli pulse-distance, come NEC, Samsung e Kaseikyo, la durata del MARK rimane approssimativamente costante mentre il valore del bit viene codificato nella durata dello SPACE successivo.

Per ogni SPACE vengono calcolati due errori:

$$ e_0 = \frac{ \left|T_S-T_{0,\mathrm{nom}}\right| }{ T_{0,\mathrm{nom}} } $$

$$ e_1 = \frac{ \left|T_S-T_{1,\mathrm{nom}}\right| }{ T_{1,\mathrm{nom}} } $$

Il bit viene deciso scegliendo il modello con errore inferiore:

$$ b = \begin{cases} 0 & e_0 \leq e_1 \\ 1 & e_1 < e_0 \end{cases} $$

Se entrambi gli errori sono troppo grandi:

$$ \min(e_0,e_1)>0.55 $$

la sequenza non viene più considerata compatibile con i dati del frame.

Viene contemporaneamente misurato anche l’errore relativo della durata dei MARK rispetto al valore nominale. Al termine della sequenza gli errori di MARK e dati vengono riassunti mediante la loro mediana.

Riconoscimento della fine del frame pulse-distance

Per evitare che una ripetizione successiva del comando venga interpretata come prosecuzione del primo frame, viene definito un intervallo massimo compatibile con la codifica dei dati:

$$ T_{\mathrm{framegap}} = \max\left( 8000\,\mu s,\; 5T_{1,\mathrm{SPACE}} \right) $$

Uno SPACE uguale o superiore a questo valore viene interpretato come separazione dal frame successivo o da un evento di repeat e interrompe l’estrazione dei bit.

È inoltre ammesso uno stop MARK finale privo di uno SPACE successivo.

Score dei protocolli pulse-distance

Per i protocolli pulse-distance lo score complessivo utilizzato dalla versione attuale è:

$$ S = 0.20\,e_C + 0.35\,e_H + 0.25\,e_D + 0.10\,e_M + 0.10\,e_B $$

dove:

Termine Significato
\(e_C\)Errore relativo della frequenza di portante.
\(e_H\)Errore dell’header.
\(e_D\)Errore mediano delle temporizzazioni che rappresentano 0 e 1.
\(e_M\)Errore mediano dei MARK dei bit.
\(e_B\)Errore relativo del numero di bit rispetto alle lunghezze previste.

Il peso maggiore attribuito all’header è intenzionale perché le temporizzazioni iniziali sono spesso particolarmente utili per distinguere famiglie di protocolli che utilizzano dati con durate molto simili.

Decodifica Sony SIRC pulse-width

Sony SIRC utilizza una codifica differente. Lo SPACE rimane sostanzialmente costante mentre è la durata del MARK a rappresentare il valore logico.

Per ogni MARK vengono quindi calcolati:

$$ e_0 = \frac{ \left|T_M-T_{0,\mathrm{nom}}\right| }{ T_{0,\mathrm{nom}} } $$

$$ e_1 = \frac{ \left|T_M-T_{1,\mathrm{nom}}\right| }{ T_{1,\mathrm{nom}} } $$

e il bit viene assegnato al valore con errore minore. Se:

$$ \min(e_0,e_1)>0.45 $$

l’estrazione viene interrotta.

Gli SPACE intermedi vengono confrontati con il tempo nominale previsto; uno SPACE superiore a quattro volte questa durata viene interpretato come fine del frame.

Lo score utilizzato è:

$$ S = 0.20\,e_C + 0.35\,e_H + 0.20\,e_D + 0.15\,e_S + 0.10\,e_B $$

Valutazione dei protocolli bifase RC5 e RC6

Per RC5 e RC6 la versione attuale non esegue ancora una decodifica completa dei bit Manchester/biphase. Il software verifica invece se le durate osservate risultano compatibili con multipli dell’unità temporale fondamentale del protocollo.

Per ogni intervallo viene calcolato:

$$ r_i = \frac{T_i}{T_u} $$

e viene individuato il multiplo intero più vicino:

$$ n_i = \operatorname{round}(r_i) $$

limitato nell’algoritmo attuale ai valori da 1 a 4.

L’errore temporale è quindi:

$$ e_T = \operatorname{median} \left( \frac{ \left|T_i-n_iT_u\right| }{ T_u } \right) $$

Viene inoltre calcolata la frazione degli intervalli eccessivamente lunghi rispetto all’unità nominale.

Per RC5 lo score è:

$$ S_{\mathrm{RC5}} = 0.35\,e_C + 0.55\,e_T + 0.10\,e_X $$

mentre per RC6, che possiede anche un header caratteristico:

$$ S_{\mathrm{RC6}} = 0.25\,e_C + 0.35\,e_H + 0.35\,e_T + 0.05\,e_X $$

La classificazione RC5/RC6 deve quindi essere interpretata come verifica di compatibilità temporale. La versione 1 del programma non ricostruisce ancora i bit dei protocolli bifase.

Contributo della frequenza di portante

Quando la frequenza di portante è disponibile, il suo errore viene calcolato come:

$$ e_C = \frac{ \left|f_{\mathrm{mis}}-f_{\mathrm{nom}}\right| }{ f_{\mathrm{nom}} } $$

La portante non viene però utilizzata come criterio esclusivo. Frequenze molto vicine sono infatti condivise da numerosi protocolli.

Se la frequenza non è disponibile, il programma assegna a questo termine un valore neutro pari a 0.10, evitando che l’assenza della misura elimini automaticamente un candidato.

Contributo del numero di bit

Il numero di bit ricostruito viene confrontato con tutte le lunghezze ammesse dal protocollo candidato.

Per ciascuna lunghezza nominale \(N_k\) viene calcolato:

$$ e_{B,k} = \frac{ \left|N_{\mathrm{mis}}-N_k\right| }{ N_k } $$

e viene utilizzato il valore minimo:

$$ e_B = \min_k(e_{B,k}) $$

con un limite massimo pari a 1.

In questo modo un protocollo con temporizzazioni plausibili ma con una lunghezza del frame incompatibile viene penalizzato senza essere eliminato sulla base di un singolo criterio.

Classificazione della confidenza

Dopo aver calcolato lo score di tutti i protocolli, i candidati vengono ordinati dal valore più piccolo al più grande.

Score Indicazione visualizzata
\(S < 0.08\)ALTA
\(0.08 \leq S < 0.16\)BUONA
\(0.16 \leq S < 0.28\)POSSIBILE
\(S \geq 0.28\)BASSA

Queste definizioni rappresentano soglie operative interne al classificatore e non livelli di confidenza statistica. Il parametro più importante rimane il confronto relativo tra il candidato migliore e gli altri protocolli analizzati.

Ricostruzione dei byte LSB-first

Per i protocolli indicati come LSB-first, una volta ricostruita la sequenza dei bit il programma raggruppa i dati in blocchi di otto.

Il valore numerico di ciascun byte viene calcolato mediante:

$$ B = \sum_{k=0}^{7} b_k\,2^k $$

dove \(b_0\) è il primo bit trasmesso del gruppo.

È quindi importante distinguere la sequenza temporale dei bit, mostrata nell’ordine di trasmissione, dalla rappresentazione esadecimale del byte risultante.

Controlli specifici per la famiglia NEC

Quando il candidato migliore appartiene alla famiglia NEC e sono stati ricostruiti esattamente quattro byte, il programma esegue ulteriori controlli sulla struttura del payload.

Nel NEC standard il secondo byte deve essere il complemento del primo e il quarto il complemento del terzo. Il controllo viene effettuato mediante XOR:

$$ B_1 \oplus B_2 = \mathrm{FF}_{16} $$

$$ B_3 \oplus B_4 = \mathrm{FF}_{16} $$

Se entrambe le condizioni sono soddisfatte il payload è fortemente compatibile con NEC standard.

Se solamente la coppia comando/complemento è valida, il software segnala la possibilità di una codifica NEC extended o di una variante appartenente alla stessa famiglia temporale. In questo caso i primi due byte vengono interpretati come indirizzo a 16 bit:

$$ Address_{16} = B_1 + 256B_2 $$

Se neppure i controlli di complemento risultano coerenti, il software mantiene comunque l’eventuale identificazione temporale come NEC family, ma segnala che il payload non segue la struttura NEC standard.

Limiti dell’algoritmo di identificazione

L’identificatore è volutamente un classificatore sperimentale e non un decoder universale. Alcuni protocolli condividono la stessa frequenza di portante, temporizzazioni molto simili oppure la stessa struttura fisica del frame. Una buona corrispondenza temporale consente quindi di riconoscere con elevata affidabilità una famiglia di protocolli, ma non garantisce sempre l’identificazione univoca della specifica variante.

Questo è particolarmente importante per la famiglia NEC, nella quale NEC, NEC2, alcune varianti extended e altri protocolli derivati possono presentare caratteristiche temporali praticamente identiche.

La versione attuale riconosce direttamente i bit dei protocolli pulse-distance e pulse-width supportati, mentre per RC5 e RC6 effettua principalmente un confronto delle caratteristiche temporali bifase. L’algoritmo è stato strutturato in modo che nuovi protocolli, ulteriori controlli sul payload e decoder più specifici possano essere aggiunti nelle versioni successive.

Perché i due algoritmi sono separati

La scelta di separare l’analisi della forma d’onda dall’identificazione del protocollo permette di rendere il sistema molto più generale.

Il primo programma si occupa esclusivamente di trasformare un segnale analogico reale, con il proprio offset, rumore, polarità e deformazione, in una sequenza temporale affidabile. Il secondo non deve conoscere né il livello di tensione né il punto del circuito dal quale proviene l’acquisizione: riceve solamente gli eventi MARK/SPACE.

Questa separazione permette inoltre di modificare in futuro il metodo di acquisizione, il parser CSV o persino lo strumento di misura senza dover riscrivere l’identificatore dei protocolli. Allo stesso modo è possibile ampliare il database dei protocolli senza intervenire sull’algoritmo che analizza la forma d’onda.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *