Estrazione dei dati binari della scheda a banda magnetica dal WAV grezzo


23

Devo affrontare una sfida difficile: estrarre dati binari da un lettore di schede a banda magnetica per iPhone . Ecco come appare la magnetizzazione sulla carta:

inserisci qui la descrizione dell'immagine
fonte

Ecco il .WAV che l'iPhone riceve quando scorri una carta (non esagerare troppo, è una carta fedeltà bonus;)). Sono tre colpi a proposito, a diverse velocità. Questa è la discarica SInt16 grezza per il colpo che sto usando.

Qualcuno sembra averlo fatto qui, ma i dati effettivi che acquisisco non sono particolarmente facili da elaborare.

La lettura inizia (e termina) con un numero indeterminato di 'zeri' - nota che l'onda si ripete solo dopo che sono stati raccolti 2 ZEROS, questo rappresenta NS seguito da SN:

inserisci qui la descrizione dell'immagine

(nota che ciascuna delle tre linee mi rappresenta mentre faccio scorrere una carta diversa; la carta in basso in questa immagine ha 15 anni, quindi il campo magnetico è chiaramente gravemente degradato in alcuni punti, non visibile in questo scatto)

Ciò consentirà a un algoritmo di accertare un segno di spunta dell'orologio.

Il campo magnetico si inverte su ogni segno di spunta dell'orologio. Anche per un binario 1, il campo magnetico si inverte esattamente nel mezzo di un segno di spunta:

inserisci qui la descrizione dell'immagine

La sequenza inizia sempre con una sentinella di avvio 1101 + 0 (bit di parità). Puoi sceglierlo in tutte e tre le letture nel grafico sopra. È indicato più chiaramente nell'articolo cosmodro che ho collegato all'inizio della domanda.

Ecco un esempio di degradazione magnetica (presa più avanti nella lettura della carta in basso): inserisci qui la descrizione dell'immagine

Sto cercando di capire un modo sensato per convertire questa forma d'onda nella corrispondente sequenza binaria.

Ho trovato un PDF che fornisce alcuni dettagli, ma non riesco a capire l'algoritmo che stanno utilizzando.

Questo PDF contiene un'immagine interessante: inserisci qui la descrizione dell'immagine

Se potessi estrarre le linee rosse e blu secondo questo diagramma, potrei usare una di esse per estrarre i dati, ma non riesco a capire la logica dietro la costruzione.

Quindi questa è la mia domanda: come estraggo la sequenza binaria?

PS. Si noti che la velocità di scorrimento non sarà costante. Quindi, una volta determinato l'orologio, deve essere costantemente regolato da un segno di spunta a quello successivo.

PPS. L'autocorrelazione catturerebbe coppie di zecche? (visto che le zecche si alterneranno NS SN ...)


EDIT (giugno '12): avevo bisogno di molto aiuto su questo, ma alla fine ho completato un lettore solido ( http://www.magstripedecoder.com/ ). Grazie per tutti quelli che hanno aiutato! Raccomando #musicdsp sul canale efnet di IRC a chiunque sia abbastanza dedicato da affrontare la sfida di affrontare la matematica - è davvero molto difficile!


Potresti pubblicare il file wav vero?
endolith,

1
Fatto! 9876543210
P


Grazie mille Yoda per aver modificato e riordinato la domanda.
P

Citi tre carte nella tua domanda. A quale scheda è associato il file WAV che hai allegato?
Jason R,

Risposte:


10

Questo si chiama codice biphase mark e devi concentrarti sugli incroci zero invece che sull'ampiezza dell'impulso. Tuttavia, si hanno più passaggi per zero per impulso, a causa dei filtri low-cut inerenti al pickup e all'ingresso del microfono del telefono. Le tue cadute più lontane di questa tra le transizioni e la croce zero:

inserisci qui la descrizione dell'immagine

È possibile ripristinare una forma più pulsante utilizzando un filtro a basso boost:

inserisci qui la descrizione dell'immagine

e quindi misurare le lunghezze degli impulsi per quanto tempo trascorrono oltre una certa soglia. Forse un'idea migliore è quella di differenziare l'input per rendere le transizioni in grandi picchi, prendere il valore assoluto e rilevarli quando superano una certa soglia:

inserisci qui la descrizione dell'immagine

Quindi misurare il tempo tra gli impulsi e quando il tempo tra due impulsi è approssimativamente uguale agli ultimi due impulsi, è uno 0, quando è circa la metà di quello che era tra gli ultimi due impulsi, è un 1.

Il degrado magnetico di cui parli dovrebbe essere facile da rimuovere con un filtro passa basso.


Grazie! Ho trovato alcune correlazioni molto interessanti lavorando con la seconda derivata che posterò a tempo debito. Puoi approfondire il filtro low-boost? Non ho idea di come implementerei questo ...
P

@endolith Potresti aggiungere tag migliori per la domanda? L'ho taggato con codifica differenziale , in base alla tua risposta, ma conosci meglio questo argomento.
Lorem Ipsum,

@yoda: Ah no no. Ne ho appena imparato qualche ora fa per scrivere questa risposta.
endolito il

@endolith Mi sono appena imbattuto in questo - è carino - tuttavia puoi spiegare questo 'filtro low boost'? Sembra davvero interessante e google non è di grande aiuto ...
Spacey,

@Mohammad: solo un filtro che aumenta le basse frequenze lasciando invariati gli alti. Penso di aver usato un equalizzatore grafico in Adobe Audition. Prova con un filtro scaffalature crca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
endolith

4

Questa è stata una vera sfida. Ho provato almeno quattro approcci prima di decifrarlo. Ecco come l'ho fatto:

inserisci qui la descrizione dell'immagine

Comincio a lisciare i dati ( prima lettura ) con un semplice ...

x_new = 0.9 * x_prev + 0.1 * x_in

... filtro IIR. Lo faccio in entrambe le direzioni ( seconda lettura ). Questo elimina tutto il rumore fuzzy, tuttavia crea discontinuità che tornano con una vendetta nei derivati.

Ottengo quindi tutti i derivati ​​fino alla quarta ( terza e quarta lettura rappresentano la terza e la quarta derivata) e creo una nuova funzione:

g(x) = f'''(x)^2 + k*f''''(x)^2

Perché? perché ho notato che quando arriviamo alla terza derivata, ciò che abbiamo è effettivamente una sinusoide all'interno di un inviluppo:

inserisci qui la descrizione dell'immagine

... e tutti sanno dalle superiori che:

sin^2 + cos^2=1 

inserisci qui la descrizione dell'immagine

e che peccato e cos si differenziano l'un l'altro:

inserisci qui la descrizione dell'immagine

Quindi la busta implicita può essere recuperata.

Perché derivati ​​3 e 4? praticamente ogni derivata superiore purifica il segnale. Ciò che è sinusoidale rimane sinusoidale (sposta solo la fase di 90 °, quindi sin-> cos ecc.) Mentre ciò che non è cadente.

Volevo usare 11 e 12 o qualcosa di folle, ma i derivati ​​si sfaldano abbastanza rapidamente, 4 è il massimo che posso ottenere prima che le cose vadano in tilt, anche allora le piccole linee di derivate che vedi nella foto vengono pesantemente levigate.

Questo produce un meraviglioso piccolo urto su ogni transizione di flusso ( quinta lettura ).

Poi passo attraverso i punti di svolta, rifiutando i ragazzi ( sesta lettura ) ..

Finalmente cammino attraverso i massimi ( settima lettura ), valutando se ogni salto è un mezzo passo o un intero passo, quindi ricostruisco il binario.

Sìì!

EDIT: Sono passati diversi mesi da quando ho completato questo progetto. la sfida più difficile è costruire una trasformazione che isola le transizioni di flusso; tecnicamente parlando, "recuperare l'inviluppo di ampiezza". ciò viene realizzato costruendo il segnale di sfasamento π / 2 dall'originale (questo è anche noto come segnale di quadratura). quindi E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.

Per ottenere il segnale di quadratura, ho semplicemente fatto un FFT e ho ruotato ogni contenitore di un quarto di giro, quindi ho ricombinato i componenti spettrali modificati.

C'è un sacco di confusione terminologica abusiva in questo campo; le parole chiave sono "segnale analitico", "trasformazione di Hilbert" ... Ho evitato di usare quelle parole chiave poiché discipline diverse assegnano loro significati diversi.

Esiste un modo molto più intelligente di ottenere questo inviluppo di ampiezza usando i filtri digitali, evitando così la trasformazione di Fourier. Ciò consente all'algoritmo di funzionare su microcontrollori a bassissima potenza.

Questo processo produce una forma d'onda che dovrebbe avere un bump unico su ogni transizione di flusso.

La decodifica di questa forma d'onda in una sequenza binaria è ancora un'attività non banale. la complessità e questa componente sono algoritmiche piuttosto che matematiche; la difficoltà è comparabile.

Tutto sommato, questo è un problema estremamente difficile. Mi ci sono voluti la parte migliore di tre mesi per ottenere il loro algoritmo di prestazione. Documenterò per intero il mio approccio e produrrò un motore di decodifica pubblicamente disponibile.


1
Le testine di lettura possono essere influenzate dai domini magnetici adiacenti e dalla transizione attualmente sotto la testina di lettura, che tende a spingere avanti e indietro le transizioni di lettura nel tempo, a seconda del modello di bit circostante.
hotpaw2,

si noti che questa tecnica non è affidabile. Sebbene fornisca risultati eccellenti per la maggior parte della traccia, non riesce a produrre un bump unico per ogni transizione di flusso all'inizio. cioè crea un doppio dosso. Sto indovinando perché la forma d'onda di input non è adeguatamente sinusoidale a questo punto. quindi sto ancora cercando delle tecniche.
P

Solo curioso, quali altre definizioni di "segnale analitico" o "trasformata di Hilbert" hai trovato? Se stai cercando l'inviluppo del segnale, puoi scoprirlo convertendolo prima in un segnale analitico (complesso). Ci sono alcuni modi per farlo, ma ciò che hai indicato non viene in genere utilizzato.
Jason R,

@JR alcune fonti sembrano definire il segnale analitico come sfasamento di 90 °, ovvero Quad (f (x)). altri come f (x) + i.Quad (f (x)). Penso di aver visto la trasformazione di Hilbert definita anche come entrambe. Non sono completamente sicuro, quindi mi sono bloccato con una notazione che dovrebbe essere inequivocabile. Sono interessato ad altre tecniche per recuperare l'inviluppo del segnale; dsp.stackexchange.com/questions/424/… sembra il posto giusto per perseguire questa discussione.
P
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.