Я столкнулся с непростой задачей: извлечь двоичные данные из устройства чтения магнитных карт 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 для всех, кто достаточно предан, чтобы справиться с математикой - это действительно очень сложно!
источник
Ответы:
Это называется кодом двухфазной метки , и вы должны сосредоточиться на пересечении нуля, а не на амплитуде импульса. У вас есть несколько пересечений нуля на импульс, однако, из-за фильтров нижних частот, присущих датчику и микрофонному входу телефона. Ваш переход дальше, чем это между переходами, и пересечь ноль:
Вы можете восстановить более пульсирующую форму, используя фильтр низкого усиления:
а затем измерьте длину импульсов по тому, как долго они проводят выше некоторого порога. Возможно, лучшая идея состоит в том, чтобы дифференцировать входные данные, чтобы сделать переходы большими скачками, взять абсолютное значение и обнаружить их, когда они превышают некоторый порог:
Затем измерьте время между импульсами, и когда время между двумя импульсами примерно такое же, как последние два импульса, это 0, когда это примерно половина того, что было между двумя последними импульсами, это 1.
Магнитное разложение, о котором вы говорите, должно быть легко устранено с помощью фильтра нижних частот.
источник
Это было довольно сложно. Я попробовал по крайней мере четыре подхода, прежде чем взломать его. Вот как я это сделал:
Я начинаю с сглаживания данных ( первое чтение ) с простого ...
... БИХ-фильтр. Я делаю это в обоих направлениях ( второе чтение ). Это избавляет от всего нечеткого шума, однако создает разрывы, которые возвращаются с удвоенной силой в производные.
Затем я получаю все производные до четвертого ( третье и четвертое показания представляют третью и четвертую производную) и создаю новую функцию:
Зачем? потому что я заметил, что к тому времени, когда мы доберемся до третьей производной, мы имеем фактически синусоиду внутри оболочки:
... и все знают из средней школы, что:
и что грех и cos различаются друг от друга:
Следовательно, подразумеваемый конверт может быть восстановлен.
Почему производные 3 и 4? в основном каждая высшая производная очищает сигнал. То, что является синусоидальным, остается синусоидальным (просто сдвигает фазу на 90 °, поэтому sin-> cos и т. Д.), Тогда как то, что не исчезает.
Я хотел использовать 11 и 12 или что-то сумасшедшее, но производные довольно быстро распадаются, 4 - это максимум, который я могу получить до того, как дела пойдут плохо, даже тогда маленькие производные линии, которые вы видите на картинке, сильно сглажены.
Это производит замечательный маленький удар на каждом переходе потока ( пятое чтение ).
Затем я прохожу поворотные моменты, отвергая лохмотья ( шестое чтение ).
Наконец, я прохожу максимумы ( седьмое чтение ), оцениваю, является ли каждый пропуск половинным или целым шагом, и затем восстанавливаю двоичный файл.
Ура!
РЕДАКТИРОВАТЬ: Прошло несколько месяцев с тех пор, как я завершил этот проект. самая трудная задача состоит в том, чтобы создать какое-то преобразование, которое изолирует переходы потока; технически говоря, «получение огибающей амплитуды». это делается путем построения сигнала фазового сдвига π / 2 из оригинала (это также называется квадратурным сигналом). тогда E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.
Чтобы получить квадратурный сигнал, я просто сделал БПФ и повернул каждую ячейку на четверть оборота, а затем рекомбинировал измененные спектральные компоненты.
В этой области есть много запутанных злоупотреблений терминологией; Ключевыми словами являются «аналитический сигнал», «Преобразование Гильберта» ... Я избегал использования этих ключевых слов, поскольку разные дисциплины присваивают им разные значения.
Существует гораздо более умный способ достижения этой огибающей амплитуды с использованием цифровых фильтров, что позволяет избежать преобразования Фурье. Это позволяет алгоритму работать на микроконтроллерах с очень малой мощностью.
Этот процесс создает форму волны, которая должна иметь уникальный выпуклость на каждом переходе потока.
Декодирование этого сигнала в двоичную последовательность - все еще нетривиальная задача. сложность и этот компонент скорее алгоритмический, чем математический; сложность сопоставима.
В общем, это чрезвычайно сложная проблема. Мне потребовалась лучшая часть трех месяцев, чтобы достигнуть их алгоритма работы. Я в кратчайшие сроки документирую мой подход и создаю общедоступный механизм декодирования.
источник