In questa sezione verrà spiegato come Magneto decodifica e legge la banda mangetica delle schede passo per passo.
In questa sezione non verrà trattato il funzionamento meccanico del lettore e l'amplificazione del segnale a livello elettronico. Vengono anche tralasciati gli algoritmi di controllo dell'affidabilità e di diminuzione del rumore di fondo.
N.B. Quando nel testo viene utilizzato un colore diverso si fa riferimento ad un oggetto disegnato nell'ultima figura vista dall'alto dello stesso colore.
L'onda letta dal lettore:
L'onda registrata dalle testine appare così (ovviamente questa è la nostra porzione di esempio).
Il segnale appare chiaro ma tuttavia abbastanza confuso, infatti la velocità (e preciò frequenza) e l'ampliezza del segnale non sono costani.
In questo tipo di lettura l'ampliezza è proporzionale alla velocità (se il segnale è costante).
Dando uno sguardo a questi picchi sarebbe difficle la decodifica anche ad occhio!
Sembra quasi che la nostra digito quando scrive sulla scheda asseconda di quanti picchi deve scrivere prende come la "carica" in altre parole più ne scrive più il segnale è forte.
Per vedere questo basta osservare a sinistra quando ci sono pochi picchi, sempre più forti, poi arriva allo zero, dopo lo zero ricomincia da capo.
A destra ci sono tanti picchi di seguito e si vede che l'onda è più forte, addirittura tra il penultimo ed il terzultimo picco "scivola" e quasi non si nota che passa per lo zero per la durata di un semiperiodo.
Lavorando in digitale da un segnale analogico registrato viene anche catturato il rumore di fondo che può essere dato:
Dalla testina, dal motorino, dall'eletrosmog, dal ferro da stiro della vicina etc...
Questo è il grafico della registrazione di tutta la banda magnetica (scheda del 1^ tipo).
Si possono vedere subito ad ochio i cancelletti di apertura e di chiusura, il picco di separazione e le trame.
In teoria lo spazio che sta fra le trame dovrebbe essere una linea diritta, ma non è così.
Questo piccolo movimento che si nota è il rumore di fondo.
Si vede anche subito che la prima trama ha un'onda che diminuisce di ampliezza, la terza trama ha un'ampliezza minore rispetto alle altre due.
Questo è proprio dovuto alla velocità non costante della scheda nel lettore.
In pratica mammano che aumenta la superficie della scheda sui rulli di trascinamento del lettore, aumenta l'attrito e diminuisce la velocità.
La prima cosa da fare è individuare il rumore di fondo da parametri fissi oppure dal segnale che c'è negli spazi.
Zero crossing per polarità:
Questa procedura serve ad identificare dove il segnale cambia di polarità.
Viene confrontato il segnale con il valore precedente e viene "tirata una riga verticale" in corrisondenza del cambio di polarità.
In pratica vengono marcati i fronti di salita e discesa del segnale, lo zero per ora viene ignorato.
La sua Regola è: Dividi in settori solo al cambio di polarità del segnale.
In questa fase viene anche calcolato il valore di picco massimo di ogni divisione.
Rimuovi rimbalzi:
Questo algoritmo (RemoveRebound), legge tutta la sezione (tra le righe verticali) e trova dove si trova il valore più alto.
Da quel punto scorre avanti ed indietro l'onda (come le frecce della figura) che nella relativa direzione consentono solo l'abbassamento del segnale.
Di conseguenza se c'è un rimbalzo questo viene eliminato portando il valore a zero.
E' un po come se venissero lanciati due rulli pesanti dalla cima dell'onda, uno a destra ed uno a sinistra, quando incontrano un rialzamento (ovvero un rimbalzo) come per un mattarello con la pasta frolla, appiattiscono i picchi del rimbalzo.
Questo algoritmo in Magneto 1.0.0 ha un inconveniente:
Nei primi due casi si nota che l'algoritmo funziona.
Nel terzo caso se sull'onda c'è un rimbalzo nel picco stesso questo viene tagliato e da luogo praticamente a due picchi.
Questo avviene se c'è un'interferenza sovrapposta al segnale in un tipico caso di sfiga!
Occorre correggere a mano l'onda.
Matrice Wave:
In questa fase dentro a queste divisioni viene calcolato divisione per divisione il valore massimo di punta del segnale.
Questi valori, divisione per divisione, vengono stivati in un array che tiene traccia di quante volte ci sono picchi/divisioni di valore massimo simile o identico.
Tutte le ampliezze dei picchi vengono ordinate in fila dal più basso al più alto, poi viene conteggiato per ogni ampliezza quante volte questa si ripete o viene riutilizzata.
Questo genera il grafico dela Matrice wave.
Viene cancellata la parte del rumore di fondo.
Poi da sinistra a destra viene osservata la seguente regola:
Trova il primo picco più usato dei precedenti e più alto
L'ampliezza di questo picco è il valore minimo che Magneto calcola automaticamente, può essere abbastanza corretto ma se la lettura è instabile o confusa allora bisogna regolarlo a mano.
Nella figura si vede il valore minimo rappresentato da due linee rosse.
Ora risulta più facile anche ad occhio la decodifica da wave a ternario.
Normalizzazione dinamica:
Questo algoritmo (DynaNorm) si occupa di portare tutti i picchi e le relative zone delimitate dalla polarità (Righe verticali) verso l'ampliezza predefinita.
Da qui in poi mostrerò un'onda di esempio diversa.
A questo punto tutti i picchi rilevanti sono ad un'ampliezza corretta, il valore minimo è già trovato e posso passare alla traduzione ne tre livelli del sistema ternario.
Tutti i pichhi hanno la stessa ampliezza.
Mi posso tranquillamente dimenticare delle divisioni verticali di polarità.
Conversione in livello ternario:
A questo punto tramite l'algorimto GateTern si legge tutto il wave modificato:
Se il segnale wave è al disopra del valore minimo, il segnale ternario sarà positivo.
Se il segnale wave si trova al disotto del valore minimo il segnale ternario sarà negativo.
Se il segnale wave sitrova all'"interno" (compreso) del valore minimo il segnale ternario sarà zero.
Completata questa operazione il segnale che ci interessa sarà questo:
A questo punto siamo riusciti a rilevare i picchi + e - del sistema pseudo ternario, ma abbiamo qualche problema a rilevare gli zero.
Allo stato attuale non si distinguerebbe uno zero da due zero di seguito.
Rilevamento del clock:
Questo algoritmo (ClockDetect) rileva qunati zero devono essere considerati nel sistema pseudoternario.
Rileva le seguenti cose:
- Gli spazi tra trama e trama:
Divide tutti gli elementi della banda in Token ovvero oggetti della banda magnetica.
questi verranno poi riconosciuti ed inseriti nella struttura Skeda.Token()
- Rileva la differenza tra le sequenze 0 e 00.
Funziona in maniera molto semplice, divide tutto il segnale ternario in tronconi contenenti una variazione dell'onda ovvero lo divide in:
- Picchi positivi
- Picchi neagtivi
- Picchi a zero
- Gap = Eventuali passaggi per zero molto piccoli fra +- e -+
Scorre questa lista di dati misurando solo nel caso di picchi positivi e negativi la lunghezza.
Se l'elemento che trova è un picco positivo o negativo memorizza la sua lunghezza.
Se l'elemento che trova è uno zero misura la sua lunghezza e vede quanti ultimi picchi positivi o negativi) ci stano, e sceglie quanti zero inserire nella decofifica.
Si ottiene una stringa per ogni token/trama di traduzione ternaria.
In questo caso con questa onda si ha: -+-00+-+-00+-+-00+-+-00+
Traduzione delle trame:
Questo algoritmo (UrmetDecoder) esegue la traduzione finale, tutti i vari tokens vengono tradotti trama per trama, byte per byte, bit per bit.
I simboli -0+ (o picchi) vengono raggruppati a blocchi di 4, escludendo il primo e l'ultimo della trama.
Questi sono i picchi di Start e Stop.
Viene verificata la sequenza (correggi tenrario) in modo che i picchi Start e Stop siano di corretta polarità, questo abilita l'iconetta "3" sulla finestra Contenutio scheda di magneto.
Viene applicata la traduzione dal sistema pseudo ternario al binario.
+ e - = 0
0 = 1
Ecco la nostra sequenza di bit in binario.
Raggruppati per 4 in formato LSB otteniamo la stringa di bytes.
A questo punto Magneto visualizza la finestra "Contenuto scheda"