Автор Тема: Задачка: декодер морзе.  (Прочитано 42449 раз)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #30 : Сентябрь 24, 2012, 10:28:38 am »
Строг говоря, задача к азбуке Морзе имеет очень опосредованное отношение, это задача декодирования цифровых данных, передаваемых аналоговым методом.
Могу продать готовые модули почти на обероне )))

DIzer

  • Гость
Re: Задачка: декодер морзе.
« Ответ #31 : Сентябрь 24, 2012, 10:48:33 am »
Строг говоря, задача к азбуке Морзе имеет очень опосредованное отношение, это задача декодирования цифровых данных, передаваемых аналоговым методом.
Могу продать готовые модули почти на обероне )))
А  fabulous  Сириус... когда, кстати,  его "рассекречивание" произойдет?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #32 : Сентябрь 24, 2012, 10:55:03 am »
А  fabulous  Сириус... когда, кстати,  его "рассекречивание" произойдет?
Это не только от меня зависит. К тому же сейчас готовится 4-я ревизия языка, довольно много изменений, поэтому компиляторы переписываются, освобождаясь попутно от не лицензированного кода. Именно 4-я ревизия будет открыта.

DIzer

  • Гость
Re: Задачка: декодер морзе.
« Ответ #33 : Сентябрь 24, 2012, 10:59:04 am »
А  fabulous  Сириус... когда, кстати,  его "рассекречивание" произойдет?
Это не только от меня зависит. К тому же сейчас готовится 4-я ревизия языка, довольно много изменений, поэтому компиляторы переписываются, освобождаясь попутно от не лицензированного кода. Именно 4-я ревизия будет открыта.
Дайте знать , пожалуйста , как только... очень интересно увидеть   и пощупать "ведомственное" изделие... то что я видел (из разработанного на шаболовках)..  дерьмо (с точки зрения пользователя...).

DIzer

  • Гость
Re: Задачка: декодер морзе.
« Ответ #34 : Сентябрь 24, 2012, 11:03:56 am »
Могу продать готовые модули почти на обероне )))
Не прокатит если НЕ ПОНИМАЕШЬ какой фильтр (или их последовательность) нужно применить...- то это как мертвому припарка... :D

Влад Жаринов

  • Full Member
  • ***
  • Сообщений: 189
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #35 : Сентябрь 24, 2012, 11:05:37 am »
Да, в коде Морзе паузы между буквами таки значение имеют... :)

Насчёт как всё организовано - в общем случае ручками... без привязки к какому бы то ни было меандру...

Вот для таких условий интересно было бы видеть решение...

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #36 : Сентябрь 24, 2012, 11:37:58 am »
Могу продать готовые модули почти на обероне )))
Не прокатит если НЕ ПОНИМАЕШЬ какой фильтр (или их последовательность) нужно применить...- то это как мертвому припарка... :D
легко. мы это используем для удаленного управления, для приема цифровых пакетов, передаваемых аналоговым способом. И хоть фотодиодами принимай, хоть фоторезистором, хоть фасеткой, хоть ...

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #37 : Сентябрь 24, 2012, 11:40:30 am »
Да, в коде Морзе паузы между буквами таки значение имеют... :)
разделители имеют значение везде - между тиками, между буквами и между словами. декодировать такое - очень легко

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #38 : Сентябрь 24, 2012, 11:56:12 am »
Да, в коде Морзе паузы между буквами таки значение имеют... :)
разделители имеют значение везде - между тиками, между буквами и между словами. декодировать такое - очень легко

А dummy decoder на Обероне написать слабо? Простейший случай (с упрощениями 1,2,3), но полный, вплоть до букв/слов :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #39 : Сентябрь 24, 2012, 12:22:45 pm »
Пусть для передачи используются два сигнала - высокий, назовем его "тик" и низкий, назовем его "так". "Таки" являются разделителями "тиков". В Морзе точка - это тик, за которым сразу следует так, а тире, по длительности это три тика(точки), за которым следует так, т.е., например буква S(три точки) = ТикТакТикТакТикТак (101010), а буква O(три тире) = ТикТикТикТакТикТикТикТакТикТикТикТак (111011101110). Разделитель между знаками букв - один Так, между буквами 3 Така, между словами 7 Таков. Сообщение SOS...---..., таким образом будет передано как-то так:
...Так]           = разделитель между буквами
[ТикТакТикТакТик] = "S"
[ТакТакТак]       = разделитель между буквами
[ТикТикТик][Так][ТикТикТик][Так][ТикТикТик]       = "O"
[ТакТакТак]       = разделитель между буквами
[ТикТакТикТакТик] = "S"
[ТакТак...        = разделитель между буквами
Учитывая, что Тик  и Так это высокий и низкий уровень сигнала (наличие/отсутствие, 1/0), то при всяких вышеуказанных допущениях и упрощениях, больших сложностей с декодированием нет. Преобразование полученной последовательности в букву можно банально по таблице перевода
« Последнее редактирование: Сентябрь 24, 2012, 12:25:46 pm от Kemet »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #40 : Сентябрь 24, 2012, 12:28:31 pm »
Учитывая, что Тик  и Так это высокий и низкий уровень сигнала (наличие/отсутствие, 1/0), то при всяких вышеуказанных допущениях и упрощениях, больших сложностей с декодированием нет. Преобразование полученной последовательности в букву можно банально по таблице перевода
Для первого варианта - можно. Я хочу увидеть как реализация этого простого варианта будет выглядеть на Обероне.
Y = λf.(λx.f (x x)) (λx.f (x x))

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Задачка: декодер морзе.
« Ответ #41 : Сентябрь 24, 2012, 01:29:17 pm »
Учитывая, что Тик  и Так это высокий и низкий уровень сигнала (наличие/отсутствие, 1/0), то при всяких вышеуказанных допущениях и упрощениях, больших сложностей с декодированием нет. Преобразование полученной последовательности в букву можно банально по таблице перевода
Для первого варианта - можно. Я хочу увидеть как реализация этого простого варианта будет выглядеть на Обероне.
Если разделить задачу на инженерную (распознавание сигнала и вывод битовой последовательности в некоторый канал) и программистскую (расшифровку Морзе-последовательности в читаемые фразы), то что для тебя представляет наибольший интерес?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #42 : Сентябрь 24, 2012, 01:39:43 pm »
Учитывая, что Тик  и Так это высокий и низкий уровень сигнала (наличие/отсутствие, 1/0), то при всяких вышеуказанных допущениях и упрощениях, больших сложностей с декодированием нет. Преобразование полученной последовательности в букву можно банально по таблице перевода
Для первого варианта - можно. Я хочу увидеть как реализация этого простого варианта будет выглядеть на Обероне.
Если разделить задачу на инженерную (распознавание сигнала и вывод битовой последовательности в некоторый канал) и программистскую (расшифровку Морзе-последовательности в читаемые фразы), то что для тебя представляет наибольший интерес?
Прямо сейчас - программистская часть, потому как первая задача для примитивного случая уже вроде бы решена Ильей. То есть нужно вторую часть и соединить её с первой (что тоже програмистская часть работы).

На следующих итерациях вылезет опять инжерерно-dsp'шная часть, но и программисту найдется чем заняться.
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #43 : Сентябрь 24, 2012, 02:29:36 pm »
Далее, с полным основанием мы можем предположить, что длительность Тика и Така равны.
Сигнал имеет устоячивую прямоугольную форму, т.е. как-то так:
     __    __    __    __
    |  |  |  |  |  |  |  |
    |  |  |  |  |  |  |  |
а) _|  |__|  |__|  |__|  |_
а не так
               
      /|    /|    /|    /|
     / |   / |   / |   / |
б) _|  |__|  |__|  |__|  |_
или даже так
     /\    /\    /\    /\
    /  \  /  \  /  \  /  \ 
в) _|  |__|  |__|  |__|  |_
Т.е. в случае а), в отличии от б) и в), мы можем с большой долей уверенности отнести полученное значение к Тику или Таку.
Теперь о приемнике. Каждое чтение мы назовем Тактом. На каждом такте чтения мы можем попасть на любой участок Тика или Така. Понятно, что если частоты передатчика и примника несинхронизированны, то мы можем некоторое время попадать только на Тики или только на Таки. Определить, что мы прочитали можно только при смене уовня сигнала. Принимаем мы с некоторой частотой, и пока уровень сигнала не изменится, мы считаем, что принимаем один знак. Приняв Разделитель мы точно знаем - знак закончился, а проанализировав длительность Разделителя мы узнаем, может уже буква закончилась или даже слово.
Если взять за основу последний приложенный файл http://oberspace.dyndns.org/index.php/topic,338.msg9063.html#msg9063

Циферки в первом столбце - это как я понимаю, номер такта, в правом - уровень сигнала.

Вплоть до 530-го Такта мы не знаем ни что принимаем (не знаем, высокий это уровень или низкий, если высокий, то точка или тире, потому что и частоту не знаем...), но прием фиксируем.
На 530-м уровень возрастает и мы сразу понимаем, что раньше был разделитель, соотвественно, отмечаем это, фиксируем значения, дальше принимаем Такты. Тактами

530-541 - мы принимаем Тик(Тики), но пока не знаем, Точка это или Тире.

С 542-552 - низкий уровень- Так(Таки), по длительности они примерно равны, поэтому можем предположить, что это было либо ТикТак, либо ТикТикТикТакТакТак, т.е. либо Точка, за котрой средует разделитель между знаками буквы, либо Тире, за которым следует разделитель между буквами.
Читаем дольше
  530 -  541  (11 Тактов)  Тик
  542 -  552  (10 Тактов)  Так
  553 -  563  (10 Тактов)  Тик
  564 -  575  (11 Тактов)  Так
Начиная с 576 мы начинаем принимать высокий сигнал, и принимаем примерно 30 Тактов, причем к концу сигнал начинает падать, но на этом шаге мы знаем, что первый Тик был именно Тиком, первый Так именно Таком, определяем их длительность в Тактах. Понимаем, что на 576-606 приняли Тире, т.е. ТикТикТик
  576 -  606  (30 Тактов)  ТикТикТик
Также понимаем, что сигнал начал портиться, но к этому моменту мы уже знаем длительность Точки, Тире и Разделителей, и можем более уверенно принимать далее.
Далее примерно с 607-го Такта идет низкий уровень и мы, учитывая неуверенный прием отсчитываем с в сравнении с примерными длительностями Разделителей Так(~10-11 Тактов) для знака ТакТакТак(~30-33 Тактов) для буквы и ТакТакТакТакТакТакТак(~70-77 Таков) для Разделителя слова.
Итак, начали с 607-го, прошли 617-й+-, значит не знак, прошли 637-й+-, значит не буква, бежим дальше, проходим и 677..-й Такт, нифига нету, только на 723-ем Такте уровень существенно возрос (722-607 = 115, какие-то сбои, но учитывая разницу 722-677= 45, можно будет в дальнейшем восстановить, но дальше опять читаем нормально
723-757 (34 Такта DIV 10 ) = ТикТикТик - Тире
758-768 (10 Тактов)= Так
769-802 (33 DIV 3) = ТикТикТик
[code]
Т.е. на данный момент мы приняли
___ТикТакТикТакТикТикТикТакТак??ТикТикТикТакТикТикТик
..- ??--

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #44 : Сентябрь 25, 2012, 11:03:18 am »
Decoder - реагирующая на очередной сэмпл "машина состояний" с памятью. И "играть" с тем, что она там помнит и в какой момент переходит между состояниями. Конфигурирование может быть разным для разных реализаций.
А зачем этому автомату память? Разве собственно самого состояния не достаточно?
Y = λf.(λx.f (x x)) (λx.f (x x))