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