Extrahieren von binären Magnetstreifenkartendaten aus rohem WAV


23

Ich stehe vor einer kniffligen Herausforderung: Binärdaten von einem iPhone-Magnetkartenleser zu extrahieren . So sieht die Magnetisierung auf der Karte aus:

Bildbeschreibung hier eingeben
Quelle

Hier ist die .WAV-Datei, die das iPhone empfängt, wenn Sie eine Karte durchziehen (setzen Sie nicht zu große Hoffnungen, es handelt sich um eine Bonus-Treuekarte;)). Das sind übrigens drei Wischbewegungen mit unterschiedlichen Geschwindigkeiten. Dies ist der Raw-SInt16-Dump für den von mir verwendeten Swipe.

Jemand scheint es hier getan zu haben, aber die von mir erfassten Daten sind nicht besonders einfach zu verarbeiten.

Der Lesevorgang beginnt (und endet) mit einer unbestimmten Anzahl von 'Nullen' - beachten Sie, dass sich die Welle erst wiederholt, nachdem 2 NULLEN gesammelt wurden. Dies stellt NS dar, gefolgt von SN:

Bildbeschreibung hier eingeben

(Beachten Sie, dass ich in jeder der drei Linien eine andere Karte wische. Die untere Karte in diesem Bild ist 15 Jahre alt, sodass das Magnetfeld an einigen Stellen deutlich beeinträchtigt ist und in dieser Aufnahme nicht sichtbar ist.)

Auf diese Weise kann ein Algorithmus einen Takt ermitteln.

Das Magnetfeld kehrt sich bei jedem Takt um. Auch bei einer binären 1 kehrt sich das Magnetfeld genau in der Mitte eines Ticks um:

Bildbeschreibung hier eingeben

Die Sequenz beginnt immer mit einem Start-Sentinel von 1101 + 0 (Paritätsbit). Sie können dies in allen drei Ablesungen in der obigen Grafik herausgreifen. Dies wird in dem Cosmodro-Artikel, den ich oben in der Frage verlinkt habe, deutlicher angegeben.

Hier ist ein Beispiel für die magnetische Degradation (weiter unten auf der Karte): Bildbeschreibung hier eingeben

Ich versuche einen vernünftigen Weg zu finden, um diese Wellenform in die entsprechende Binärsequenz umzuwandeln.

Ich habe ein PDF gefunden , das einige Details enthält, aber ich kann den verwendeten Algorithmus nicht herausfinden.

Dieses PDF enthält ein interessantes Bild: Bildbeschreibung hier eingeben

Wenn ich die roten und blauen Linien gemäß diesem Diagramm extrahieren könnte, könnte ich eine von ihnen zum Extrahieren der Daten verwenden, aber ich kann die Logik hinter der Konstruktion nicht herausfinden.

Das ist also meine Frage: Wie extrahiere ich die Binärsequenz?

PS. Beachten Sie, dass die Wischgeschwindigkeit nicht konstant sein wird. Sobald die Uhr ermittelt wurde, muss sie ständig von einem Tick zum nächsten angepasst werden.

PPS. Würde Fang Autokorrelationspaare von Zecken? (Da Zecken abwechseln werden NS SN ...)


BEARBEITEN (Juni '12): Ich brauchte eine Menge Hilfe, habe aber endlich einen soliden Reader fertiggestellt ( http://www.magstripedecoder.com/ ). Vielen Dank für alle, die mitgeholfen haben! Ich empfehle #musicdsp im efnet-Kanal des IRC für alle, die sich der Herausforderung stellen, die Mathematik in den Griff zu bekommen - es ist wirklich sehr, sehr schwer!


Könnten Sie die eigentliche WAV-Datei posten?
Endolith

1
Getan! 9876543210
P i


Vielen Dank, Yoda, dass du die Frage bearbeitet und aufgeräumt hast.
P i

Sie erwähnen drei Karten in Ihrer Frage. Mit welcher Karte ist die angehängte WAV-Datei verknüpft?
Jason R

Antworten:


10

Dies wird als Zweiphasenmarkierungscode bezeichnet , und Sie müssen sich auf die Nulldurchgänge anstatt auf die Impulsamplituden konzentrieren. Aufgrund der dem Tonabnehmer und dem Mikrofoneingang des Telefons eigenen Low-Cut-Filter haben Sie jedoch mehrere Nulldurchgänge pro Impuls. Ihre fallen zwischen den Übergängen weiter ab und kreuzen die Null:

Bildbeschreibung hier eingeben

Sie können eine pulsierendere Form wiederherstellen, indem Sie einen Low-Boost-Filter verwenden:

Bildbeschreibung hier eingeben

und dann die Pulslängen danach messen, wie lange sie über einer Schwelle verbringen. Vielleicht ist es eine bessere Idee, die Eingabe zu differenzieren, um die Übergänge in große Spitzen zu verwandeln, den absoluten Wert zu nehmen und sie zu erkennen, wenn sie einen bestimmten Schwellenwert überschreiten:

Bildbeschreibung hier eingeben

Dann messen Sie die Zeit zwischen den Impulsen und wenn die Zeit zwischen zwei Impulsen ungefähr gleich den letzten beiden Impulsen ist, ist es eine 0, wenn es ungefähr die Hälfte von dem ist, was es zwischen den letzten beiden Impulsen war, ist es eine 1.

Die magnetische Verschlechterung, von der Sie sprechen, sollte mit einem Tiefpassfilter leicht zu entfernen sein.


Vielen Dank! Ich habe einige sehr interessante Zusammenhänge mit der zweiten Ableitung gefunden, die ich zu gegebener Zeit veröffentlichen werde. Können Sie den Low-Boost-Filter näher erläutern? Ich habe keine Ahnung, wie ich das umsetzen würde ...
P i

@endolith Könnten Sie bitte bessere Tags für die Frage hinzufügen? Ich habe die Differenzialcodierung basierend auf Ihrer Antwort markiert , aber Sie kennen dieses Thema besser.
Lorem Ipsum

@yoda: Haha nein ich nicht. Ich habe es erst vor ein paar Stunden erfahren, um diese Antwort zu schreiben.
Endolith

@endolith Ich bin gerade darauf gestoßen - das ist schön - aber können Sie diesen "Low-Boost-Filter" erklären? Scheint wirklich interessant, und Google ist nicht viel Hilfe ...
Spacey

@Mohammad: Nur ein Filter, der die tiefen Frequenzen verstärkt und die hohen unverändert lässt. Ich glaube, ich habe in Adobe Audition einen Grafik-Equalizer verwendet. Probieren Sie einen Regalfilter aus. Crca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
endolith

4

Das war eine ziemliche Herausforderung. Ich habe mindestens vier Ansätze ausprobiert, bevor ich es geknackt habe. So habe ich es gemacht:

Bildbeschreibung hier eingeben

Ich beginne mit der Glättung der Daten ( erste Lesung ) mit einem einfachen ...

x_new = 0.9 * x_prev + 0.1 * x_in

... IIR-Filter. Ich mache das in beide Richtungen ( zweite Lesung ). Dies beseitigt das gesamte Fuzzy-Rauschen, erzeugt jedoch Diskontinuitäten, die in den Derivaten mit aller Macht wieder auftreten.

Ich erhalte dann alle Ableitungen bis zur vierten ( dritte und vierte Ablesung stellen die dritte und vierte Ableitung dar) und erstelle eine neue Funktion:

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

Warum? weil mir aufgefallen ist, dass wir bei Erreichen der dritten Ableitung tatsächlich eine Sinuskurve in einem Umschlag haben:

Bildbeschreibung hier eingeben

... und jeder weiß von der High School, dass:

sin^2 + cos^2=1 

Bildbeschreibung hier eingeben

und dass Sünde und Cosinus sich unterscheiden:

Bildbeschreibung hier eingeben

Somit kann der implizite Umschlag wiederhergestellt werden.

Warum Ableitungen 3 und 4? Grundsätzlich reinigt jede höhere Ableitung das Signal. Was sinusförmig ist, bleibt sinusförmig (verschiebt nur die Phase um 90 °, also sin-> cos usw.), wohingegen das, was nicht wegfällt.

Ich wollte 11 & 12 oder etwas Verrücktes benutzen, aber die Derivate fallen ziemlich schnell auseinander, 4 ist die höchste, die ich bekommen kann, bevor die Dinge durcheinander geraten, selbst wenn die kleinen abgeleiteten Linien, die Sie auf dem Bild sehen, stark geglättet sind.

Dies erzeugt eine wunderbare kleine Beule bei jedem Flussübergang ( fünfte Lesung ).

Als nächstes gehe ich durch die Wendepunkte und lehne Blindgänger ab ( sechste Lesung ).

Schließlich gehe ich durch die Maxima ( siebte Lesung ), bewerte, ob jeder Sprung ein halber oder ein ganzer Schritt ist, und rekonstruiere dann die Binärzahl.

Yay!

EDIT: Es ist nun einige Monate her, dass ich dieses Projekt abgeschlossen habe. Die schwierigste Herausforderung besteht darin, eine Transformation zu konstruieren, die Flussübergänge isoliert. technisch gesehen, "Abrufen der Amplitudenhüllkurve". Dies geschieht durch Konstruieren des π / 2-Phasenverschiebungssignals aus dem Original (dies wird auch als Quadratursignal bezeichnet). dann ist E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.

Um das Quadratursignal zu erhalten, habe ich einfach eine FFT durchgeführt, jedes Bin eine Vierteldrehung gedreht und dann die modifizierten Spektralkomponenten neu kombiniert.

Auf diesem Gebiet gibt es viele verwirrende und missbräuchliche Begriffe. Schlüsselwörter sind "analytisches Signal", "Hilbert-Transformation" ... Ich habe es vermieden, diese Schlüsselwörter zu verwenden, da verschiedene Disziplinen ihnen unterschiedliche Bedeutungen zuweisen.

Es gibt eine viel intelligentere Möglichkeit, diese Amplitudenhüllkurve mit digitalen Filtern zu erzielen und so die Fourier-Transformation zu vermeiden. Dadurch kann der Algorithmus auf Mikrocontrollern mit sehr geringer Leistung ausgeführt werden.

Dieser Prozess erzeugt eine Wellenform, die über jedem Flussübergang eine eindeutige Erhebung aufweisen sollte.

Das Dekodieren dieser Wellenform in eine Binärsequenz ist immer noch eine nicht triviale Aufgabe. Die Komplexität und diese Komponente sind eher algorithmisch als mathematisch. Die Schwierigkeit ist vergleichbar.

Alles in allem ist dies ein äußerst schwieriges Problem. Ich habe den größten Teil von drei Monaten gebraucht, um ihren Leistungsalgorithmus zu erreichen. Ich werde meinen Ansatz in der Fülle der Zeit dokumentieren und eine öffentlich verfügbare Decoder-Engine produzieren.


1
Leseköpfe können durch benachbarte magnetische Domänen sowie den Übergang unter dem Lesekopf beeinflusst werden, wodurch die Leseübergänge abhängig vom umgebenden Bitmuster in der Regel zeitlich vor- und zurückgeschoben werden.
hotpaw2

Beachten Sie, dass diese Technik nicht zuverlässig ist. Obwohl es für den größten Teil der Strecke hervorragende Ergebnisse liefert, kann es nicht zu einem frühen Zeitpunkt für jeden Flussübergang eine eindeutige Erhebung erzeugen. dh es entsteht eine doppelte Beule. Ich vermute, weil die Eingangswellenform zu diesem Zeitpunkt nicht geeignet sinusförmig ist. Also suche ich immer noch nach Techniken.
P i

Nur neugierig, welche anderen Definitionen für "analytisches Signal" oder "Hilbert-Transformation" haben Sie gefunden? Wenn Sie nach der Hüllkurve des Signals suchen, können Sie diese ermitteln, indem Sie sie zunächst in ein (komplexes) analytisches Signal konvertieren. Es gibt einige Möglichkeiten, dies zu tun, aber was Sie angegeben haben, wird normalerweise nicht verwendet.
Jason R

@JR Einige Quellen scheinen das analytische Signal als die 90 ° -Phasenverschiebung zu definieren, dh Quad (f (x)). andere wie f (x) + i.Quad (f (x)). Ich glaube, ich habe die Hilbert-Transformation auch als beides definiert gesehen. Ich bin mir nicht ganz sicher, also habe ich mich an eine Notation gehalten, die eindeutig sein sollte. Ich interessiere mich für andere Techniken zum Abrufen der Signalhüllkurve. dsp.stackexchange.com/questions/424/… scheint der richtige Ort zu sein, um diesem Thread nachzugehen .
P i
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.