Цитата(mSimple @ Jan 30 2009, 20:07)

Открою маленький секрет. Эту задачу мне выдали на одном из собеседований при приеме на работу...
И следовательно задача надежности приема-передачи данных не стоит. Это какая-то типовая задача в интерфейсах передачи данных. Честно скажу, я с такими не сталкивался. Вот и подумал, может по условию можно будет что-то понять, на что он похож и где решаются такие задачи. Единственно, есть пожелание по возможности избежать сильного джиттера выдаваемых синхроимпульсов, но до этого еще рано.
PS: Фокус с подсчетом длительности положительного уровня последовательности не прошел, т.к. частота опорная не кратна частоте переключения последовательности.. в общем стыдно мне, стыдно!

Похож он на битовую посылку данных, в которой закодированы синхроимпульсы сопровождения. (Ваша повышенная опорная частота это принадлежность приемника. ЕЕ нет надобности тащить.) И про джиттер тоже забудьте. Самим протоколом приема передачи данных это решается.
Чтобы выделить из посылки принимаемых данных синхроимпульсы - идут на ухищрения. Ведь требуется подстройка внутренних синхрочасов (Ваша опорная), чтобы данные не потерять. Подстроиться можно только по перепаду фронта в посылке данных. У манчестера этот перепад в середине бита,
или из 0 в 1 или из 1 в 0. У arinc - 429 (летайте самолетами аэрофлота) детектируется 1, если уровень в канале выше 3В и детектируется 0 - если уровень напряжения в канале меньше минус 3 вольт. Поэтому на выходе драйвера два цифровых выхода. На первом единица, если в линии была1, на другом единица, если в линии был 0. Вне на обоих линиях - это логический 0. Чтобы выделить из посылки данных синхроимпульс, эти даные передаются в интервале половины периода клока. Т. Е. детектированные поочередно в линии 1 и 0 логические единицы, собранные по ИЛИ и есть этот синхроклок. Остается его сдвинуть и принять посылку по линии 1.
Ваши синхроимпульсы очень похожи на протокол arinc -429 (Но выдернутые из середины преобразования посылки данных. От Вас скрыли детектирование нулей в потоке данных))
Вам поставили задачу не корректно. Потому что мало выделить из потока данных синхроимпульс. Нужна пауза в посылке данных, чтобы правильно идентифицировать начало пакета. (У манчестера это синхроимпульс (искаженный манчестер)
В Вашем только частном случае, когда только такие данные и никакие другие не будут принматься, можно восстановить синхроимпульсы (подстраивая внутренние часы по уровню логической 1 в посылке). Но для этого ВЫ должны уже точно ЗНАТЬ частоту приема данных (2.048)
(Не подсчитывать длительность 1 уровня, а операться на точное знание этой длительности)
Чтобы вне уровня логической 1 (где нули) самому нарезать на этой частоте недостающие синхроимпульсы. Естественно будет увеличиваться рассоглаование частот передачи и приема, но это не важно. Ведь Вам все равно надо сдвинуть полученные синхроимпульсы из потока данных.
Вот и сдвиньте их на примерно середину интервала уровня 1 в посылке данных, это перекроет интервал рассогласования за периоды четырех нулей
в ту или иную сторону от середины уровня 1 в посылке. (когда нет возможности подстроить внутренние синхрочасы уровнем 1 в линии)
http://www.holtic.com/