2010-10-28 5 views
1

Я работаю над встроенной системой реального времени. Я пытаюсь создать подробный анализ времени. Я собрал данные времени выполнения, записывая время начала и окончания каждого прерывания. Каждый пакет данных выглядит что-то вроде этогоАлгоритм для сборки последовательности из нескольких фрагментов

ISR# time 
----- ---- 
    1  34 
    end 44 
    4  74 
    3  80 
    end 93 
    end 97 
    ... 

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

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

Мне кажется, что это почти как проблема секвенирования генов. У меня есть несколько тысяч фрагментов, каждая из которых покрывает 7% от общего кадра. I должен быть в состоянии выровнять их - сопоставить части, которые покрывают ту же часть кадра - таким образом, что я могу построить единую последовательность событий за весь период. Там будут некоторые изменения от кадра к кадру, но я надеюсь, что они могут быть учтены в алгоритме наилучшего соответствия.

Итак, мой вопрос: существуют ли алгоритмы для такого рода секвенирования? Существуют ли какие-либо существующие инструменты, не предназначенные для ДНК или Protiens?

+0

Еще один угол для преследования - это сжатие записи, чтобы вы могли вместить 10x больше данных в свой журнал. Дельта-сжатие для временных меток, сворачивание адресов в индексы, использование записей переменной длины, так что «конец» может быть выражен более сжато и т. Д. –

+0

Это неплохая идея, но она неплохо сжимается. Каждая запись использует 4 бита для ID и 12 бит для метки времени. Я могу уменьшить количество бит на печать, уменьшив разрешение таймера. Возможна доработка до 14 бит, но это создает свои собственные манипуляции с данными, отправляя их через 16-разрядный ориентированный последовательный канал. – AShelly

+0

Я еще не совсем понимаю - вы выполняете несколько независимых прогонов, каждый вокруг 2 мс, из которых вы захватываете около 150 мс каждый раз? Является ли последовательность прерываний запущена и остановлена ​​детерминированной (то же самое для каждого прогона) или почти так? Если да, то да, это точно так же, как сборка последовательности ДНК; если нет, я не вижу, как вы могли бы надеяться на их соответствие. –

ответ

2

Ваши данные кажутся довольно специфичными для приложения, поэтому вам просто нужно поэкспериментировать. Сначала проверьте, достаточно ли различается порядок вызовов ISR с номерами прерываний (без информации о времени); просто возьмите последние N вызовов каждого всплеска и выполните поиск, чтобы найти любые другие всплески с похожими фрагментами в начале. Вы можете использовать любой строковый алгоритм поиска для этой задачи. Если возвращено слишком мало совпадений, попробуйте алгоритм нечеткого поиска. Если возвращается слишком много совпадений, попробуйте более разумный алгоритм совпадения, который также весит каждое соответствие по подобию таймингов. В целом это не должно быть слишком сложным, поскольку полная цепочка составляет всего около 15 всплесков, тогда как, например, в секвенировании ДНК вам нужно сопоставить миллионы очень коротких фрагментов.