Estou diante de um desafio complicado: extrair dados binários de um leitor de cartão de fita magnética do iPhone . É assim que a magnetização do cartão se parece:
Aqui está o .WAV que o iPhone recebe quando você passa um cartão (não tenha muitas esperanças, é um cartão de fidelidade bônus;)). A propósito, são três golpes, em velocidades diferentes. Este é o dump SInt16 bruto para o furto que estou usando.
Alguém parece ter feito isso aqui, mas os dados reais que capturo não são particularmente fáceis de processar.
A leitura começa (e termina) com um número indeterminado de 'zeros' - observe que a onda só se repete após a coleta de 2 ZEROS, isso representa NS seguido por SN:
(observe que cada uma das três linhas me representa passando um cartão diferente; o cartão inferior nesta imagem tem 15 anos; portanto, o campo magnético é claramente severamente degradado em alguns lugares, não visível nesta foto)
Isso permitirá que um algoritmo verifique um relógio.
O campo magnético reverte a cada tique do relógio. Também para um binário 1, o campo magnético reverte exatamente no meio de um tique:
A sequência sempre começa com um sentinela inicial 1101 + 0 (bit de paridade). Você pode escolher isso nas três leituras no gráfico acima. É indicado mais claramente no artigo do cosmodro que eu liguei na parte superior da pergunta.
Aqui está um exemplo de degradação magnética (levado adiante na leitura do cartão inferior):
Estou tentando descobrir uma maneira sensata de converter essa forma de onda em sua sequência binária correspondente.
Eu encontrei um PDF que entra em alguns detalhes, mas não consigo descobrir o algoritmo que eles estão usando.
Este PDF contém uma imagem interessante:
Se eu pudesse extrair as linhas vermelha e azul conforme este diagrama, poderia usar qualquer uma delas para extrair os dados, mas não consigo descobrir a lógica por trás da construção.
Portanto, esta é a minha pergunta: como extrair a sequência binária?
PS. Observe que a velocidade do furto não será constante. Assim, uma vez que o relógio tenha sido determinado, é necessário ajustar constantemente o número de um tick para o próximo.
PPS. A autocorrelação pegaria pares de tiques? (visto que os ticks alternarão o NS SN ...)
EDIT (junho '12): Eu precisava de muita ajuda nesse caso, mas finalmente completei um sólido leitor ( http://www.magstripedecoder.com/ ). Obrigado a todos que ajudaram! Eu recomendo #musicdsp no canal efnet do IRC para qualquer pessoa dedicada o suficiente para enfrentar o desafio de entender a matemática - é realmente muito difícil!
Respostas:
Isso é chamado código de marca bifásica , e você precisa se concentrar nas passagens de zero em vez das amplitudes de pulso. Você tem vários cruzamentos de zero por pulso, no entanto, devido aos filtros de corte baixo inerentes ao captador e à entrada de microfone do telefone. O seu cai mais longe que isso entre transições e cruza o zero:
Você pode restaurar uma forma mais pulsante usando um filtro de baixo impulso:
e, em seguida, meça a duração do pulso em quanto tempo eles passam acima de algum limite. Talvez uma idéia melhor seja diferenciar a entrada para fazer as transições em grandes picos, pegar o valor absoluto e detectá-las quando elas ultrapassarem algum limite:
Em seguida, meça o tempo entre os pulsos e, quando o tempo entre dois pulsos for aproximadamente o mesmo que os últimos dois pulsos, será um 0, quando for aproximadamente metade do que era entre os últimos dois pulsos, será 1.
A degradação magnética de que você fala deve ser fácil de remover com um filtro passa-baixo.
fonte
Este foi um grande desafio. Eu tentei pelo menos quatro abordagens antes de quebrar. Foi assim que eu fiz:
Começo suavizando os dados ( primeira leitura ) com um simples ...
... filtro IIR. Faço isso nas duas direções ( segunda leitura ). Isso elimina todo o ruído difuso, no entanto, cria descontinuidades que voltam com uma vingança nos derivados.
Em seguida, pego todas as derivadas até a quarta ( terceira e quarta leituras representam a terceira e a quarta derivada) e crio uma nova função:
Por quê? porque notei que, quando chegamos à terceira derivada, o que temos é efetivamente um sinusóide dentro de um envelope:
... e todo mundo sabe do ensino médio que:
e que pecado e cos se diferenciam:
Portanto, o envelope implícito pode ser recuperado.
Por que derivativos 3 e 4? basicamente, cada derivada superior purifica o sinal. Aquilo que é sinusoidal permanece sinusoidal (apenas muda a fase 90 ° para que sin-> cos etc) enquanto que o que não é cai.
Eu queria usar 11 e 12 ou algo doido, mas os derivativos desmoronam rapidamente, 4 é o mais alto que posso obter antes que as coisas se complicem, mesmo assim as pequenas linhas de derivativos que você vê na imagem são suavizadas.
Isso produz um pequeno salto maravilhoso em cada transição de fluxo ( quinta leitura ).
Em seguida, passo pelos pontos de inflexão, rejeitando insucessos ( sexta leitura ).
Finalmente , passo pelo máximo ( sétima leitura ), avaliando se cada salto é um meio ou um passo inteiro e depois reconstruo o binário.
Yay!
EDIT: Faz alguns meses que eu concluí este projeto. o desafio mais difícil é construir alguma transformação que isola as transições de fluxo; tecnicamente falando, 'recuperando o envelope de amplitude'. isso é feito através da construção do sinal de deslocamento de fase π / 2 a partir do original (também conhecido como sinal de quadratura). então E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.
Para obter o sinal de quadratura, simplesmente fiz uma FFT, girei cada compartimento um quarto de volta e recombinei os componentes espectrais modificados.
Há muitas terminologias abusivas confusas neste campo; palavras-chave são 'sinal analítico', 'transformação de Hilbert' ... Evitei usar essas palavras-chave porque diferentes disciplinas atribuem significados diferentes a elas.
Existe uma maneira muito mais inteligente de alcançar esse envelope de amplitude usando filtros digitais, evitando assim a transformação de Fourier. Isso permite que o algoritmo seja executado em microcontroladores de potência muito baixa.
Esse processo produz uma forma de onda que deve ter um impacto único sobre cada transição de fluxo.
Decodificar essa forma de onda em uma sequência binária ainda é uma tarefa não trivial. a complexidade e esse componente são algorítmicos e não matemáticos; a dificuldade é comparável.
Tudo isso é um problema extremamente difícil. Levei a melhor parte de três meses para alcançar seu algoritmo de desempenho. Durante todo o tempo, documentarei minha abordagem e produzirei um mecanismo de decodificador disponível ao público.
fonte