Stoję przed trudnym wyzwaniem: wyodrębnić dane binarne z czytnika kart magnetycznych iPhone'a . Tak wygląda namagnesowanie na karcie:
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:
(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:
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):
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:
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!
źródło
Odpowiedzi:
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:
Możesz przywrócić bardziej pulchny kształt, używając filtra niskiego doładowania:
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:
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.
źródło
To było spore wyzwanie. Wypróbowałem co najmniej cztery podejścia, zanim go złamałem. Oto jak to zrobiłem:
Zaczynam od wygładzenia danych ( pierwszego czytania ) prostym ...
... 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ę:
Czemu? ponieważ zauważyłem, że zanim dojdziemy do trzeciej pochodnej, faktycznie mamy sinusoidę wewnątrz koperty:
... i wszyscy wiedzą ze szkoły średniej, że:
a grzech i cos różnią się między sobą:
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.
źródło