Extraction de données de carte à bande magnétique binaire à partir de WAV brut


23

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:

entrez la description de l'image ici
La source

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:

entrez la description de l'image ici

(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:

entrez la description de l'image ici

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): entrez la description de l'image ici

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: entrez la description de l'image ici

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!


Pourriez-vous publier le fichier wav réel?
endolith

1
Terminé! 9876543210
P i


Merci beaucoup Yoda d'avoir édité et rangé la question.
P i

Vous mentionnez trois cartes dans votre question. À quelle carte le fichier WAV auquel vous êtes attaché est-il associé?
Jason R

Réponses:


10

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:

entrez la description de l'image ici

Vous pouvez restaurer une forme plus pulsée en utilisant un filtre à faible amplification:

entrez la description de l'image ici

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:

entrez la description de l'image ici

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.


Merci! J'ai trouvé des corrélations très intéressantes en travaillant avec la dérivée seconde que je publierai en temps voulu. Pouvez-vous élaborer sur le filtre à faible amplification? Je n'ai aucune idée de la façon dont j'implémenterais cela ...
P i

@endolith Pourriez-vous s'il vous plaît ajouter de meilleures balises pour la question? Je l'ai étiqueté avec un codage différentiel , basé sur votre réponse, mais vous connaissez mieux ce sujet.
Lorem Ipsum

@yoda: Haha non je ne le fais pas. Je viens de l'apprendre il y a quelques heures pour écrire cette réponse.
endolith

@endolith Je viens de découvrir ceci - c'est bien - mais pouvez-vous expliquer ce «filtre à faible amplification»? Semble vraiment intéressant, et google n'est pas d'une grande aide ...
Spacey

@Mohammad: Juste un filtre qui amplifie les basses fréquences tout en laissant les aigus inchangés. Je pense que j'ai utilisé un égaliseur graphique dans Adobe Audition. Essayez un filtre à étagères crca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
endolith

4

C'était tout un défi. J'ai essayé au moins quatre approches avant de le casser. Voici comment je l'ai fait:

entrez la description de l'image ici

Je commence par lisser les données ( première lecture ) avec un simple ...

x_new = 0.9 * x_prev + 0.1 * x_in

... 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:

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

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:

entrez la description de l'image ici

... et tout le monde sait au lycée que:

sin^2 + cos^2=1 

entrez la description de l'image ici

et que le péché et le cos se différencient l'un de l'autre:

entrez la description de l'image ici

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.


1
Les têtes de lecture peuvent être affectées par des domaines magnétiques adjacents ainsi que par la transition actuellement sous la tête de lecture, qui a tendance à pousser les transitions de lecture d'avant en arrière dans le temps, en fonction de la configuration binaire environnante.
hotpaw2

notez que cette technique n'est pas fiable. Bien qu'il donne d'excellents résultats pour la plupart des pistes, il ne parvient pas à produire une bosse unique pour chaque transition de flux dès le début. c'est à dire qu'il crée une double bosse. Je suppose que la forme d'onde d'entrée n'est pas convenablement sinusoïdale à ce stade. donc je suis toujours à la recherche de techniques.
P i

Juste curieux, quelles autres définitions de «signal analytique» ou de «transformée de Hilbert» avez-vous trouvées? Si vous recherchez l'enveloppe du signal, vous pouvez le trouver en le convertissant d'abord en un signal analytique (complexe). Il existe plusieurs façons de procéder, mais ce que vous avez indiqué n'est généralement pas utilisé.
Jason R

@JR certaines sources semblent définir le signal analytique comme le déphasage de 90 ° c'est-à-dire Quad (f (x)). d'autres comme f (x) + i.Quad (f (x)). Je pense que j'ai également vu la transformation de Hilbert définie comme les deux. Pas complètement sûr, donc je suis resté avec une notation qui ne devrait pas être ambiguë. Je suis intéressé par d'autres techniques de récupération de l'enveloppe du signal; dsp.stackexchange.com/questions/424/… semble le bon endroit pour poursuivre ce fil.
P i
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.