Wydobywanie danych binarnych kart magnetycznych z surowego WAV

23

Stoję przed trudnym wyzwaniem: wyodrębnić dane binarne z czytnika kart magnetycznych iPhone'a . Tak wygląda namagnesowanie na karcie:

wprowadź opis zdjęcia tutaj
Źródło

Oto .WAV, który iPhone otrzymuje po przesunięciu karty (nie rób zbyt wielkich nadziei, jest to dodatkowa karta lojalnościowa;)). Nawiasem mówiąc, to trzy machnięcia przy różnych prędkościach. Jest to surowy zrzut SInt16 dla przeciągnięcia, którego używam.

Ktoś wydaje się to zrobić tutaj ale rzeczywiste przechwytywania danych nie jest szczególnie łatwe w obróbce.

Odczyt rozpoczyna się (i kończy) od nieokreślonej liczby „zer” - zauważ, że fala powtarza się dopiero po zebraniu 2 ZEROS, co oznacza NS, po którym następuje SN:

wprowadź opis zdjęcia tutaj

(zwróć uwagę, że każda z trzech linii przedstawia mnie przesuwającego inną kartę; dolna karta na tym zdjęciu ma 15 lat, więc pole magnetyczne jest wyraźnie silnie degradowane w niektórych miejscach, niewidoczne na tym zdjęciu)

Umożliwi to algorytmowi ustalenie tyknięcia zegara.

Pole magnetyczne odwraca się przy każdym tyknięciu zegara. Również dla binarnego 1 pole magnetyczne odwraca się dokładnie w środku tyknięcia:

wprowadź opis zdjęcia tutaj

Sekwencja zaczyna się zawsze od wartownika 1101 + 0 (bit parzystości). Możesz to wybrać we wszystkich trzech odczytach na powyższym wykresie. Jest to wyraźniej wskazane w artykule o kosmodrze, który zamieściłem na początku pytania.

Oto przykład degradacji magnetycznej (dalej czytany na dolnej karcie): wprowadź opis zdjęcia tutaj

Próbuję znaleźć rozsądny sposób na przekształcenie tego przebiegu w odpowiadającą mu sekwencję binarną.

Znalazłem jeden plik PDF, który zawiera pewne szczegóły, ale nie mogę zrozumieć algorytmu, którego używają.

Ten plik PDF zawiera jeden interesujący obraz: wprowadź opis zdjęcia tutaj

Gdybym mógł wyodrębnić czerwone i niebieskie linie zgodnie z tym diagramem, mógłbym użyć jednego z nich do wyodrębnienia danych, ale nie mogę zrozumieć logiki stojącej za konstrukcją.

Oto moje pytanie: jak wyodrębnić sekwencję binarną?

PS. Pamiętaj, że prędkość przeciągnięcia nie będzie stała. Więc po ustaleniu zegara, należy stale dostosowywać od jednego ticka do drugiego.

PPS. Czy autokorelacja wyłapałaby pary kleszczy? (widząc jak tykają naprzemiennie NS SN ...)


EDYCJA (czerwiec '12): Potrzebowałem dużo pomocy w tej sprawie, ale w końcu ukończyłem solidnego czytelnika ( http://www.magstripedecoder.com/ ). Dziękujemy wszystkim, którzy pomogli! Polecam #musicdsp na kanale efnet IRC każdemu, kto poświęci się na tyle, by zmierzyć się z matematyką - to naprawdę bardzo trudne!

Liczba Pi
źródło
Czy możesz opublikować plik wav?
endolith
1
Gotowy! 9876543210
P i
Dziękuję bardzo Yoda za edycję i uporządkowanie pytania.
P i
W swoim pytaniu wspominasz o trzech kartach. Z którą kartą jest powiązany plik WAV?
Jason R

Odpowiedzi:

10

Nazywa się to kodem dwufazowym i musisz skupić się na przecięciach zera zamiast amplitud impulsu. Masz jednak wiele przejść przez zero na impuls, ze względu na filtry dolnoprzepustowe nieodłącznie związane z przetwornikiem i wejściem mikrofonowym telefonu. Twoje spadają dalej niż między przejściami i przekraczają zero:

wprowadź opis zdjęcia tutaj

Możesz przywrócić bardziej pulchny kształt, używając filtra niskiego doładowania:

wprowadź opis zdjęcia tutaj

a następnie zmierzyć długości impulsu, jak długo spędzają powyżej pewnego progu. Być może lepszym pomysłem jest zróżnicowanie danych wejściowych, aby przekształcić się w duże skoki, przyjąć wartość bezwzględną i wykryć je, gdy przekroczą pewien próg:

wprowadź opis zdjęcia tutaj

Następnie zmierz czas między impulsami, a kiedy czas między dwoma impulsami jest w przybliżeniu taki sam jak ostatnich dwóch impulsów, jest to 0, gdy jest to około połowa tego, co było pomiędzy dwoma ostatnimi impulsami, to 1.

Degradacja magnetyczna, o której mówisz, powinna być łatwa do usunięcia za pomocą filtra dolnoprzepustowego.

endolit
źródło
Dzięki! Znalazłem kilka bardzo interesujących korelacji pracujących z drugą pochodną, ​​które opublikuję we właściwym czasie. Czy potrafisz opracować filtr niskiego doładowania? Nie mam pojęcia, jak to zaimplementować ...
P i
@endolith Czy możesz dodać lepsze tagi do pytania? Oznacziłem to kodowaniem różnicowym w oparciu o twoją odpowiedź, ale znasz ten temat lepiej.
Lorem Ipsum
@yoda: Haha nie ja nie. Właśnie dowiedziałem się o tym kilka godzin temu, aby napisać tę odpowiedź.
endolith
@endolith Właśnie się z tym spotkałem - to miłe - jednak czy możesz wyjaśnić ten „filtr niskiego doładowania”? Wydaje się to naprawdę interesujące, a Google nie jest zbyt pomocny ...
Spacey
@Mohammad: Tylko filtr, który wzmacnia niskie częstotliwości, pozostawiając wysokie bez zmian. Myślę, że użyłem korektora graficznego w Adobe Audition. Spróbuj regały filtra crca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
endolit
4

To było spore wyzwanie. Wypróbowałem co najmniej cztery podejścia, zanim go złamałem. Oto jak to zrobiłem:

wprowadź opis zdjęcia tutaj

Zaczynam od wygładzenia danych ( pierwszego czytania ) prostym ...

x_new = 0.9 * x_prev + 0.1 * x_in

... filtr IIR. Robię to w obu kierunkach ( drugie czytanie ). Pozbywa się to całego rozmytego hałasu, jednak tworzy nieciągłości, które powracają z zemstą w pochodnych.

Następnie otrzymuję wszystkie pochodne do czwartej ( trzecie i czwarte odczyty reprezentują trzecią i czwartą pochodną) i tworzę nową funkcję:

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

Czemu? ponieważ zauważyłem, że zanim dojdziemy do trzeciej pochodnej, faktycznie mamy sinusoidę wewnątrz koperty:

wprowadź opis zdjęcia tutaj

... i wszyscy wiedzą ze szkoły średniej, że:

sin^2 + cos^2=1 

wprowadź opis zdjęcia tutaj

a grzech i cos różnią się między sobą:

wprowadź opis zdjęcia tutaj

Stąd domniemana koperta może zostać odzyskana.

Dlaczego pochodne 3 i 4? w zasadzie każda wyższa pochodna oczyszcza sygnał. To, co jest sinusoidalne, pozostaje sinusoidalne (po prostu przesuwa fazę o 90 °, więc sin-> cos itp.), Podczas gdy to, co nie spada.

Chciałem użyć 11 i 12 lub czegoś szalonego, ale pochodne rozpadają się dość szybko, 4 to najwyższy poziom, jaki mogę uzyskać, zanim wszystko stanie się szalone, nawet wtedy małe linie pochodnych, które widzisz na zdjęciu, są mocno wygładzone.

Powoduje to cudowne uderzenie przy każdym przejściu strumienia ( piąte czytanie ).

Następnie przechodzę przez punkty zwrotne, odrzucając niewypały ( szóste czytanie ) ..

W końcu przechodzę przez maksima ( siódme czytanie ), oceniając, czy każdy pominięcie jest o pół kroku, czy o cały krok, a następnie rekonstruuję plik binarny.

Tak!

EDYCJA: Od ukończenia tego projektu minęło już kilka miesięcy. najtrudniejszym wyzwaniem jest zbudowanie transformacji izolującej przejścia strumienia; technicznie rzecz biorąc, „odzyskiwanie obwiedni amplitudy”. odbywa się to poprzez konstruowanie sygnału przesunięcia fazowego π / 2 z oryginału (jest to również znane jako sygnał kwadraturowy). następnie E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.

Aby uzyskać sygnał kwadraturowy, po prostu zrobiłem FFT i obróciłem każdy pojemnik o ćwierć obrotu, a następnie zrekombinowałem zmodyfikowane składowe widmowe.

W tej dziedzinie istnieje wiele mylących, obraźliwych terminów; słowa kluczowe to „sygnał analityczny”, „transformacja Hilberta” ... Unikałem używania tych słów kluczowych, ponieważ różne dyscypliny przypisują im różne znaczenia.

Istnieje znacznie mądrzejszy sposób osiągnięcia tej obwiedni amplitudy za pomocą filtrów cyfrowych, unikając w ten sposób transformacji Fouriera. Umożliwia to działanie algorytmu na mikrokontrolerach o bardzo niskiej mocy.

W wyniku tego procesu powstaje kształt fali, który powinien mieć unikalny wybrzuszenie dla każdego przejścia strumienia.

Dekodowanie tego przebiegu do sekwencji binarnej nadal jest niełatwym zadaniem. złożoność i ten element jest raczej algorytmiczny niż matematyczny; trudność jest porównywalna.

W sumie jest to niezwykle trudny problem. Najlepszą część trzech miesięcy zajęło mi osiągnięcie algorytmu wydajności. W pełni czasu udokumentuję swoje podejście i opracuję publicznie dostępny silnik dekodera.

Liczba Pi
źródło
1
Na głowice czytające mogą wpływać sąsiednie domeny magnetyczne, a także przejścia znajdujące się obecnie pod głowicą czytającą, które mają tendencję do przesuwania przejść odczytu tam iz powrotem, w zależności od otaczającego wzoru bitowego.
hotpaw2,
zauważ, że ta technika nie jest niezawodna. Chociaż daje doskonałe wyniki dla większości toru, nie tworzy unikalnego uderzenia dla każdego przejścia strumienia na początku. tzn. tworzy podwójny guz. Zgaduję, ponieważ fala wejściowa nie jest w tym momencie odpowiednio sinusoidalna. więc wciąż szukam technik.
P i
Ciekawe, jakie inne definicje „sygnału analitycznego” lub „transformacji Hilberta” znalazłeś? Jeśli szukasz obwiedni sygnału, możesz to znaleźć, najpierw konwertując go na (złożony) sygnał analityczny. Można to zrobić na kilka sposobów, ale zwykle nie używasz tego, co wskazałeś.
Jason R
@JR niektóre źródła wydają się definiować sygnał analityczny jako przesunięcie fazowe o 90 °, tj. Quad (f (x)). inne jako f (x) + i.Quad (f (x)). Wydaje mi się, że widziałem transformację Hilberta zdefiniowaną jako oba z nich. Nie jestem do końca pewien, więc trzymałem się notacji, która powinna być jednoznaczna. Interesują mnie inne techniki wyszukiwania obwiedni sygnału; Wydaje się, że dsp.stackexchange.com/questions/424/… jest właściwym miejscem do kontynuowania tego wątku.
P i