Je suis confronté à un défi délicat: extraire des données binaires d'un lecteur de carte à bande magnétique pour iPhone . Voici à quoi ressemble la magnétisation sur la carte:
Voici le .WAV que l'iPhone reçoit lorsque vous glissez une carte (n'espérez pas trop, c'est une carte de fidélité bonus;)). Soit dit en passant, trois coups à des vitesses différentes. Il s'agit du vidage SInt16 brut pour le balayage que j'utilise.
Quelqu'un semble l'avoir fait ici, mais les données réelles que je capture ne sont pas particulièrement faciles à traiter.
La lecture commence (et se termine) avec un nombre indéterminé de `` zéros '' - notez que l'onde ne se répète qu'après que 2 ZEROS ont été collectés, cela représente NS suivi de SN:
(notez que chacune des trois lignes me représente en train de glisser une carte différente; la carte du bas de cette image a 15 ans, donc le champ magnétique est clairement gravement dégradé à certains endroits, non visible sur cette photo)
Cela permettra à un algorithme de vérifier un tick d'horloge.
Le champ magnétique s'inverse à chaque tick d'horloge. Aussi pour un 1 binaire, le champ magnétique s'inverse exactement au milieu d'une tique:
La séquence commence toujours par une sentinelle de début 1101 + 0 (bit de parité). Vous pouvez le découvrir dans les trois lectures du graphique ci-dessus. Cela est indiqué plus clairement dans l'article cosmodro que j'ai lié en haut de la question.
Voici un exemple de dégradation magnétique (pris plus loin sur la lecture de la carte du bas):
J'essaie de trouver un moyen sensé de convertir cette forme d'onde en sa séquence binaire correspondante.
J'ai trouvé un PDF qui rentre dans les détails, mais je n'arrive pas à comprendre l'algorithme qu'ils utilisent.
Ce PDF contient une image intéressante:
Si je pouvais extraire les lignes rouges et bleues conformément à ce diagramme, je pourrais utiliser l'une ou l'autre pour extraire les données, mais je ne peux pas comprendre la logique derrière la construction.
Voici donc ma question: comment extraire la séquence binaire?
PS. Notez que la vitesse de balayage ne sera pas constante. Ainsi, une fois que l'horloge a été déterminée, elle doit être constamment ajustée d'un tick à l'autre.
PPS. L'autocorrélation attraperait-elle des paires de tiques? (vu que les tiques alterneront NS SN ...)
EDIT (juin '12): J'avais besoin de beaucoup d'aide sur celui-ci, mais finalement j'ai terminé un solide lecteur ( http://www.magstripedecoder.com/ ). Merci à tous ceux qui ont aidé! Je recommande #musicdsp sur la chaîne efnet de l'IRC à toute personne suffisamment dévouée pour relever le défi de se familiariser avec les mathématiques - c'est vraiment très difficile!
Réponses:
C'est ce qu'on appelle le code de marque biphasé , et vous devez vous concentrer sur les passages par zéro au lieu des amplitudes d'impulsion. Cependant, vous avez plusieurs passages à zéro par impulsion, en raison des filtres coupe-bas inhérents au micro et à l'entrée micro du téléphone. Le vôtre tombe plus loin que cela entre les transitions et franchit zéro:
Vous pouvez restaurer une forme plus pulsée en utilisant un filtre à faible amplification:
puis mesurer les longueurs d'impulsion par combien de temps ils passent au-dessus d'un certain seuil. Peut-être une meilleure idée est de différencier l'entrée pour effectuer les transitions en grands pics, prendre la valeur absolue et les détecter quand elles dépassent un certain seuil:
Ensuite, mesurez le temps entre les impulsions, et lorsque le temps entre deux impulsions est approximativement le même que les deux dernières impulsions, c'est un 0, quand il est environ la moitié de ce qu'il était entre les deux dernières impulsions, c'est un 1.
La dégradation magnétique dont vous parlez devrait être facile à éliminer avec un filtre passe-bas.
la source
C'était tout un défi. J'ai essayé au moins quatre approches avant de le casser. Voici comment je l'ai fait:
Je commence par lisser les données ( première lecture ) avec un simple ...
... Filtre IIR. Je fais cela dans les deux sens ( deuxième lecture ). Cela supprime tout le bruit flou, mais cela crée des discontinuités qui reviennent avec une vengeance dans les dérivés.
J'obtiens alors tous les dérivés jusqu'au quatrième (les troisième et quatrième lectures représentent le troisième et quatrième dérivé), et crée une nouvelle fonction:
Pourquoi? parce que j'ai remarqué qu'au moment où nous arrivons à la troisième dérivée, ce que nous avons est effectivement une sinusoïde à l'intérieur d'une enveloppe:
... et tout le monde sait au lycée que:
et que le péché et le cos se différencient l'un de l'autre:
Par conséquent, l'enveloppe implicite peut être récupérée.
Pourquoi les dérivés 3 et 4? fondamentalement, chaque dérivé supérieur purifie le signal. Ce qui est sinusoïdal reste sinusoïdal (décale simplement la phase de 90 ° donc sin-> cos etc.) tandis que ce qui ne l'est pas tombe.
Je voulais utiliser 11 & 12 ou quelque chose de fou, mais les dérivés se désagrègent assez rapidement, 4 est le plus élevé que je puisse obtenir avant que les choses ne tournent mal, même alors les petites lignes dérivées que vous voyez dans l'image sont fortement lissées.
Cela produit une merveilleuse petite bosse à chaque transition de flux ( cinquième lecture ).
Ensuite, je marche à travers les points tournants, rejetant les ratés ( sixième lecture ) ..
Enfin, je passe par les maxima ( septième lecture ), évaluant si chaque saut est un demi-pas ou un pas entier, puis reconstruit le binaire.
Yay!
EDIT: Cela fait maintenant plusieurs mois que j'ai terminé ce projet. le défi le plus difficile est de construire une transformation qui isole les transitions de flux; techniquement parlant, «récupérer l'enveloppe d'amplitude». cela se fait en construisant le signal de déphasage π / 2 à partir de l'original (également connu sous le nom de signal en quadrature). alors E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.
Pour obtenir le signal en quadrature, j'ai simplement fait une FFT et j'ai fait tourner chaque bin d'un quart de tour, puis j'ai recombiné les composantes spectrales modifiées.
Il y a beaucoup de confusion dans la terminologie abusive dans ce domaine; les mots clés sont «signal analytique», «transformée de Hilbert» ... J'ai évité d'utiliser ces mots clés car différentes disciplines leur attribuent des significations différentes.
Il existe un moyen beaucoup plus intelligent d'atteindre cette enveloppe d'amplitude à l'aide de filtres numériques, évitant ainsi la transformée de Fourier. Cela permet à l'algorithme de fonctionner sur des microcontrôleurs de très faible puissance.
Ce processus produit une forme d'onde qui devrait avoir une bosse unique sur chaque transition de flux.
Décoder cette forme d'onde en une séquence binaire est toujours une tâche non triviale. la complexité et cette composante sont algorithmiques plutôt que mathématiques; la difficulté est comparable.
Dans l'ensemble, c'est un problème extrêmement difficile. Cela m'a pris la meilleure partie de trois mois pour réaliser leur algorithme de performance. Je documenterai en temps voulu mon approche et produirai un moteur de décodeur accessible au public.
la source