Me enfrento a un desafío complicado: extraer datos binarios de un lector de tarjetas de banda magnética de iPhone . Así es como se ve la magnetización en la tarjeta:
Aquí está el .WAV que recibe el iPhone cuando desliza una tarjeta (no espere demasiado, es una tarjeta de fidelidad adicional). Eso es tres golpes por cierto, a diferentes velocidades. Este es el volcado de SInt16 sin procesar para el deslizamiento que estoy usando.
Alguien parece haberlo hecho aquí, pero los datos reales que capturo no son particularmente fáciles de procesar.
La lectura comienza (y termina) con un número indeterminado de 'ceros': tenga en cuenta que la onda solo se repite después de que se hayan recolectado 2 ZEROS, esto representa NS seguido de SN:
(tenga en cuenta que cada una de las tres líneas me representa deslizar una tarjeta diferente; la tarjeta inferior en esta imagen tiene 15 años, por lo que el campo magnético está claramente degradado en algunos lugares, no visible en esta foto)
Esto permitirá que un algoritmo determine una marca de reloj.
El campo magnético se invierte en cada tictac del reloj. También para un binario 1, el campo magnético se invierte exactamente en el medio de una marca:
La secuencia siempre comienza con un centinela de inicio 1101 + 0 (bit de paridad). Puede seleccionar esto en las tres lecturas en el gráfico anterior. Se indica más claramente en el artículo cosmodro que vinculé en la parte superior de la pregunta.
Aquí hay un ejemplo de degradación magnética (más adelante en la lectura de la tarjeta inferior):
Estoy tratando de encontrar una manera sensata de convertir esta forma de onda en su secuencia binaria correspondiente.
He encontrado un PDF que entra en algunos detalles, pero no puedo entender el algoritmo que están utilizando.
Este PDF contiene una imagen interesante:
Si pudiera extraer las líneas rojas y azules según este diagrama, podría usar cualquiera de ellas para extraer los datos, pero no puedo entender la lógica detrás de la construcción.
Entonces esta es mi pregunta: ¿Cómo extraigo la secuencia binaria?
PD. Tenga en cuenta que la velocidad de deslizamiento no será constante. Entonces, una vez que se ha determinado el reloj, debe ajustarse constantemente de un tic a otro.
PPS ¿La autocorrelación atraparía pares de garrapatas? (ya que las garrapatas alternarán NS SN ...)
EDITAR (junio '12): necesitaba mucha ayuda en este caso, pero finalmente he completado un lector sólido ( http://www.magstripedecoder.com/ ). ¡Gracias por todos los que ayudaron! Recomiendo #musicdsp en el canal efnet de IRC para cualquier persona lo suficientemente dedicada como para asumir el desafío de familiarizarse con las matemáticas, ¡es realmente muy difícil!
Respuestas:
Esto se llama código de marca bifase , y debe enfocarse en los cruces por cero en lugar de las amplitudes de pulso. Sin embargo, tiene múltiples cruces por cero por pulso, debido a los filtros de corte bajo inherentes a la toma y la entrada de micrófono del teléfono. El tuyo cae más lejos que esto entre transiciones y cruza cero:
Puede restaurar una forma más pulsante utilizando un filtro de bajo impulso:
y luego miden las longitudes de pulso por el tiempo que pasan por encima de un umbral. Tal vez una mejor idea es diferenciar la entrada para hacer las transiciones en picos grandes, tomar el valor absoluto y detectarlos cuando superan algún umbral:
Luego mida el tiempo entre pulsos, y cuando el tiempo entre dos pulsos es aproximadamente el mismo que los dos últimos pulsos, es un 0, cuando es aproximadamente la mitad de lo que era entre los dos últimos pulsos, es un 1.
La degradación magnética de la que habla debe ser fácil de eliminar con un filtro de paso bajo.
fuente
Esto fue todo un desafío. Intenté al menos cuatro enfoques antes de descifrarlo. Así es como lo hice:
Comienzo suavizando los datos ( primera lectura ) con un simple ...
... filtro IIR. Hago esto en ambas direcciones ( segunda lectura ). Esto elimina todo el ruido difuso, sin embargo, crea discontinuidades que regresan con una venganza en los derivados.
Luego obtengo todas las derivadas hasta la cuarta (las lecturas tercera y cuarta representan la tercera y cuarta derivada), y creo una nueva función:
¿Por qué? porque noté que cuando llegamos a la tercera derivada, lo que tenemos es efectivamente una sinusoide dentro de un sobre:
... y todos saben desde la escuela secundaria que:
y que el pecado y el cos se diferencian entre sí:
Por lo tanto, el sobre implícito se puede recuperar.
¿Por qué derivados 3 y 4? básicamente cada derivada superior purifica la señal. Lo que es sinusoidal permanece sinusoidal (solo cambia la fase 90 °, así que sin-> cos, etc.) mientras que lo que no es se cae.
Quería usar 11 y 12 o algo loco, pero las derivadas se desmoronan bastante rápido, 4 es lo más alto que puedo obtener antes de que las cosas se vuelvan locas, incluso cuando las pequeñas líneas derivadas que ves en la imagen se suavizan mucho.
Esto produce un pequeño golpe maravilloso en cada transición de flujo ( quinta lectura ).
Luego camino a través de los puntos de inflexión, rechazando trapos ( sexta lectura ).
Finalmente paso por los máximos ( séptima lectura ), evaluando si cada salto es medio paso o un paso completo, y luego reconstruyo el binario.
¡Hurra!
EDITAR: Hace ya varios meses que completé este proyecto. El desafío más difícil es construir alguna transformación que aísle las transiciones de flujo; técnicamente hablando, 'recuperar el sobre de amplitud'. Esto se hace construyendo la señal de cambio de fase π / 2 a partir de la original (esto también se conoce como señal de cuadratura). entonces E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.
Para obtener la señal de cuadratura, simplemente hice una FFT, y giré cada contenedor un cuarto de vuelta, luego recombiné los componentes espectrales modificados.
Hay mucha terminología abusiva confusa en este campo; las palabras clave son 'señal analítica', 'transformación de Hilbert' ... He evitado usar esas palabras clave ya que diferentes disciplinas les asignan diferentes significados.
Hay una forma mucho más inteligente de lograr esta envolvente de amplitud utilizando filtros digitales, evitando así la transformación de Fourier. Esto permite que el algoritmo se ejecute en microcontroladores de muy baja potencia.
Este proceso produce una forma de onda que debería tener una protuberancia única sobre cada transición de flujo.
Decodificar esta forma de onda en una secuencia binaria sigue siendo una tarea no trivial. la complejidad y este componente es algorítmico más que matemático; La dificultad es comparable.
En general, este es un problema extremadamente difícil. Me llevó la mejor parte de tres meses lograr su algoritmo de rendimiento. En el tiempo completo documentaré mi enfoque y produciré un motor de decodificador disponible al público.
fuente