Ich stehe vor einer kniffligen Herausforderung: Binärdaten von einem iPhone-Magnetkartenleser zu extrahieren . So sieht die Magnetisierung auf der Karte aus:
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:
(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:
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):
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:
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!
Antworten:
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:
Sie können eine pulsierendere Form wiederherstellen, indem Sie einen Low-Boost-Filter verwenden:
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:
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.
quelle
Das war eine ziemliche Herausforderung. Ich habe mindestens vier Ansätze ausprobiert, bevor ich es geknackt habe. So habe ich es gemacht:
Ich beginne mit der Glättung der Daten ( erste Lesung ) mit einem einfachen ...
... 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:
Warum? weil mir aufgefallen ist, dass wir bei Erreichen der dritten Ableitung tatsächlich eine Sinuskurve in einem Umschlag haben:
... und jeder weiß von der High School, dass:
und dass Sünde und Cosinus sich unterscheiden:
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.
quelle