Извлечение данных двоичной карты с магнитной полосой из необработанного файла WAV

23

Я столкнулся с непростой задачей: извлечь двоичные данные из устройства чтения магнитных карт iPhone . Вот как выглядит намагниченность на карте:

введите описание изображения здесь
Источник

Вот .WAV, который iPhone получает, когда вы проводите карту (не надейтесь слишком сильно, это бонусная карта лояльности;)). Это, кстати, три удара на разных скоростях. Это необработанный дамп SInt16 для свайпа, который я использую.

Кто-то, кажется, сделал это здесь, но реальные данные, которые я собираю, не особенно легко обработать.

Чтение начинается (и заканчивается) с неопределенного числа «нулей» - обратите внимание, что волна повторяется только после того, как 2 ноля были собраны, это представляет NS, а затем SN:

введите описание изображения здесь

(обратите внимание, что каждая из трех строк представляет меня, когда я проводил по другой карточке; нижней карточке на этом изображении 15 лет, поэтому магнитное поле в некоторых местах явно сильно ухудшилось, что не видно на этом снимке)

Это позволит алгоритму установить тик часов.

Магнитное поле меняется на каждый такт. Также для бинарного 1 магнитное поле меняется точно в середине тика:

введите описание изображения здесь

Последовательность всегда начинается с 1101 + 0 (бит четности), запускаемого сторожем. Вы можете выбрать это во всех трех чтениях на графике выше. Это более четко указано в статье о космодро, на которую я ссылаюсь в верхней части вопроса.

Вот пример магнитной деградации (взятый далее при чтении нижней карты): введите описание изображения здесь

Я пытаюсь найти разумный способ преобразовать эту форму волны в соответствующую двоичную последовательность.

Я нашел один PDF-файл , в котором есть некоторые детали, но я не могу понять алгоритм, который они используют.

Этот PDF содержит одно интересное изображение: введите описание изображения здесь

Если бы я мог извлечь красные и синие линии в соответствии с этой диаграммой, я мог бы использовать любую из них для извлечения данных, но я не могу понять логику построения.

Итак, это мой вопрос: как извлечь двоичную последовательность?

PS. Обратите внимание, что скорость смахивания не будет постоянной. Таким образом, как только часы определены, их нужно постоянно настраивать от одного тика к другому.

PPS. Будет ли автокорреляция ловить пары клещей? (видя, как тики будут чередоваться NS SN ...)


РЕДАКТИРОВАТЬ (июнь '12): Мне нужно было много помощи по этому вопросу, но, наконец, я закончил твердый читатель ( http://www.magstripedecoder.com/ ). Спасибо всем, кто помог! Я рекомендую #musicdsp на канале IRC efnet для всех, кто достаточно предан, чтобы справиться с математикой - это действительно очень сложно!

Число Пи
источник
Не могли бы вы опубликовать фактический файл WAV?
Эндолит
1
Выполнено! 9876543210
П и
Хм. Ваша форма волны не похожа на другие примеры, которые я могу найти. 2.bp.blogspot.com/_QF4k-mng6_A/TOzDBOzIB3I/AAAAAAAAAbM/… monografias.com/trabajos43/banda-magna/Image4228.gif embeddedsoftwareengineering.com/img/mag-max-maxx.gif
endolith
Спасибо большое Йода за редактирование и приведение в порядок вопроса.
П и
Вы упоминаете три карты в своем вопросе. С какой картой связан файл WAV?
Джейсон Р

Ответы:

10

Это называется кодом двухфазной метки , и вы должны сосредоточиться на пересечении нуля, а не на амплитуде импульса. У вас есть несколько пересечений нуля на импульс, однако, из-за фильтров нижних частот, присущих датчику и микрофонному входу телефона. Ваш переход дальше, чем это между переходами, и пересечь ноль:

введите описание изображения здесь

Вы можете восстановить более пульсирующую форму, используя фильтр низкого усиления:

введите описание изображения здесь

а затем измерьте длину импульсов по тому, как долго они проводят выше некоторого порога. Возможно, лучшая идея состоит в том, чтобы дифференцировать входные данные, чтобы сделать переходы большими скачками, взять абсолютное значение и обнаружить их, когда они превышают некоторый порог:

введите описание изображения здесь

Затем измерьте время между импульсами, и когда время между двумя импульсами примерно такое же, как последние два импульса, это 0, когда это примерно половина того, что было между двумя последними импульсами, это 1.

Магнитное разложение, о котором вы говорите, должно быть легко устранено с помощью фильтра нижних частот.

эндолиты
источник
Благодарность! Я нашел несколько очень интересных корреляций со второй производной, которые я опубликую в свое время. Можете ли вы рассказать о фильтре с низким усилением? Я понятия не имею, как бы я это реализовал ...
P i
@endolith Не могли бы вы добавить лучшие теги для вопроса? Я отметил это дифференциальным кодированием , основываясь на вашем ответе, но вы знаете эту тему лучше.
Lorem Ipsum
@yoda: Ха-ха, нет, не знаю. Я только что узнал об этом несколько часов назад, чтобы написать этот ответ.
Эндолит
@endolith Я только что натолкнулся на это - это хорошо - однако, вы можете объяснить этот «фильтр низкого усиления»? Кажется действительно интересным, и Google не очень помогает ...
Spacey
@Mohammad: просто фильтр, который повышает низкие частоты, оставляя максимумы неизменными. Я думаю, что я использовал графический эквалайзер в Adobe Audition. Попробуйте полочный фильтр crca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
эндолиты
4

Это было довольно сложно. Я попробовал по крайней мере четыре подхода, прежде чем взломать его. Вот как я это сделал:

введите описание изображения здесь

Я начинаю с сглаживания данных ( первое чтение ) с простого ...

x_new = 0.9 * x_prev + 0.1 * x_in

... БИХ-фильтр. Я делаю это в обоих направлениях ( второе чтение ). Это избавляет от всего нечеткого шума, однако создает разрывы, которые возвращаются с удвоенной силой в производные.

Затем я получаю все производные до четвертого ( третье и четвертое показания представляют третью и четвертую производную) и создаю новую функцию:

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

Зачем? потому что я заметил, что к тому времени, когда мы доберемся до третьей производной, мы имеем фактически синусоиду внутри оболочки:

введите описание изображения здесь

... и все знают из средней школы, что:

sin^2 + cos^2=1 

введите описание изображения здесь

и что грех и cos различаются друг от друга:

введите описание изображения здесь

Следовательно, подразумеваемый конверт может быть восстановлен.

Почему производные 3 и 4? в основном каждая высшая производная очищает сигнал. То, что является синусоидальным, остается синусоидальным (просто сдвигает фазу на 90 °, поэтому sin-> cos и т. Д.), Тогда как то, что не исчезает.

Я хотел использовать 11 и 12 или что-то сумасшедшее, но производные довольно быстро распадаются, 4 - это максимум, который я могу получить до того, как дела пойдут плохо, даже тогда маленькие производные линии, которые вы видите на картинке, сильно сглажены.

Это производит замечательный маленький удар на каждом переходе потока ( пятое чтение ).

Затем я прохожу поворотные моменты, отвергая лохмотья ( шестое чтение ).

Наконец, я прохожу максимумы ( седьмое чтение ), оцениваю, является ли каждый пропуск половинным или целым шагом, и затем восстанавливаю двоичный файл.

Ура!

РЕДАКТИРОВАТЬ: Прошло несколько месяцев с тех пор, как я завершил этот проект. самая трудная задача состоит в том, чтобы создать какое-то преобразование, которое изолирует переходы потока; технически говоря, «получение огибающей амплитуды». это делается путем построения сигнала фазового сдвига π / 2 из оригинала (это также называется квадратурным сигналом). тогда E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.

Чтобы получить квадратурный сигнал, я просто сделал БПФ и повернул каждую ячейку на четверть оборота, а затем рекомбинировал измененные спектральные компоненты.

В этой области есть много запутанных злоупотреблений терминологией; Ключевыми словами являются «аналитический сигнал», «Преобразование Гильберта» ... Я избегал использования этих ключевых слов, поскольку разные дисциплины присваивают им разные значения.

Существует гораздо более умный способ достижения этой огибающей амплитуды с использованием цифровых фильтров, что позволяет избежать преобразования Фурье. Это позволяет алгоритму работать на микроконтроллерах с очень малой мощностью.

Этот процесс создает форму волны, которая должна иметь уникальный выпуклость на каждом переходе потока.

Декодирование этого сигнала в двоичную последовательность - все еще нетривиальная задача. сложность и этот компонент скорее алгоритмический, чем математический; сложность сопоставима.

В общем, это чрезвычайно сложная проблема. Мне потребовалась лучшая часть трех месяцев, чтобы достигнуть их алгоритма работы. Я в кратчайшие сроки документирую мой подход и создаю общедоступный механизм декодирования.

Число Пи
источник
1
На считывающие головки могут воздействовать смежные магнитные домены, а также переход, находящийся в настоящее время под считывающей головкой, который имеет тенденцию толкать переходы чтения назад и вперед во времени, в зависимости от окружающего битового рисунка.
hotpaw2
обратите внимание, что этот метод не является надежным. Несмотря на то, что он дает отличные результаты для большей части трека, он не может произвести уникальный удар для каждого перехода потока на ранней стадии. то есть это создает двойной удар. Я предполагаю, потому что входной сигнал не является подходящим синусоидальным в этой точке. так что я все еще ищу методы.
P i
Просто любопытно, какие еще определения «аналитического сигнала» или «преобразования Гильберта» вы нашли? Если вы ищете огибающую сигнала, вы можете найти ее, сначала преобразовав ее в (сложный) аналитический сигнал. Есть несколько способов сделать это, но то, что вы указали, обычно не используется.
Джейсон Р
@JR Некоторые источники, похоже, определяют аналитический сигнал как сдвиг фазы на 90 °, то есть Quad (f (x)). другие как f (x) + i.Quad (f (x)). Я думаю, что видел преобразование Гильберта, определенное как оба из них также. Не совсем уверен, поэтому я придерживался обозначений, которые должны быть однозначными. Я заинтересован в других методах получения огибающей сигнала; dsp.stackexchange.com/questions/424/… кажется подходящим местом для этой темы .
P i