Демодуляция манчестерского кода
От: host  
Дата: 04.04.04 12:20
Оценка:
Есть сигнал с инфракрасного приемника, который представляет собой массив из мескольких (20-30) байт, описывающие типа "осциллограмму" полученного ИК-кода, каждый байт этого массива описывает длительность выского или низкого уровня сигнала (т.е. логического 0 или 1). В этом массиве получается закодированный ИК код методом двухфазной модуляции (Манчестерский код). Согласно такой двухфазной модуляции, содержимое каждого бита командного слова определяется направлением изменения логического уровня в середине соответствующего бит-интервала: переход с ВЫСОКОГО на НИЗКИЙ уровень означает логический "0", а обратный переход (с НИЗКОГО на ВЫСОКИЙ уровень) — логическую "1". Проблема — не могу реализовать декодирование массива. никак вся эта умность в голове не уложится.
Re: Демодуляция манчестерского кода
От: Кодт Россия  
Дата: 05.04.04 09:22
Оценка:
Здравствуйте, host, Вы писали:

H>Есть сигнал с инфракрасного приемника, который представляет собой массив из мескольких (20-30) байт, описывающие типа "осциллограмму" полученного ИК-кода, каждый байт этого массива описывает длительность выского или низкого уровня сигнала (т.е. логического 0 или 1). В этом массиве получается закодированный ИК код методом двухфазной модуляции (Манчестерский код). Согласно такой двухфазной модуляции, содержимое каждого бита командного слова определяется направлением изменения логического уровня в середине соответствующего бит-интервала: переход с ВЫСОКОГО на НИЗКИЙ уровень означает логический "0", а обратный переход (с НИЗКОГО на ВЫСОКИЙ уровень) — логическую "1". Проблема — не могу реализовать декодирование массива. никак вся эта умность в голове не уложится.


Дык всё просто.
Будем считать, что частота модуляции равна частоте сэмплирования. В этом случае массив будет выглядеть как последовательность единиц и двоек.

Сначала немного моделирования
уровень при   элементы массива   текущий   логическое    переход      новый
t=-1012       [+0][+1]           уровень   значение      по массиву   уровень
    <>
   __#_         2   1             _        "1"           +2           _
   __##         2   2             _        "1"           +1           #
   #_##         1   2             _        "1"           +1           #
   _#__         1   2             #        "0"           +1           _
   ##__         2   2             #        "0"           +1           _
   ##_#         2   1             #        "0"           +2           #

Обозначим индекс текущего элемента массива как k, сам массив как s, текущий уровень l (низкий _ = 1, высокий # = 0).
Видно, что состояние и выход автомата зависят от s[k+1].
result = l;
if(s[k+1] == 2)
  l = ~l, k+=1;
else
  k+=2;
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.