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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #75 : Сентябрь 25, 2012, 03:29:09 pm »
А зачем этому автомату память? Разве собственно самого состояния не достаточно?
Допустим, хранить средний уровень сигнала за какой-то интервал назад...
Это обычно делается не в декодере (который оперирует уже бинарными данными), то есть не в конечном автомате, а в узле что данные "бинаризует". В DSP-модуле.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #76 : Сентябрь 25, 2012, 03:37:18 pm »
Ну правильно, + и даст нам объединение двух Сетов, т.е. логическое Или, главное в longintval нужный множитель закатать
Использовать SYSTEM на ровном месте - не кошерно же :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #77 : Сентябрь 25, 2012, 03:51:15 pm »
Использовать SYSTEM на ровном месте - не кошерно же :-)
Пожалуйся на Вирта в вашигтонский обком, пусть их нафик разбомбят, а то навыдумывали, обероны какие-то, даже INCL нормально не работает, в производных и то додумались сделать правильно )))
ну если систем не кошерен, а конкретная реализация также оторвана от жисти, то тогда только математика
правда CASE Вирт еще не удалил из языка... он знааал, что кому-нибудь да пригодится
я вот вспоминаю, что подобная проблема на Оберонкоре возникала, что-то вроде задачки от Галкова или ка-то так, я никак не мог понять в чем проблема, но я ТруОбероны не использовал, а в Сириусом более реальные вещи приходится решать, и там битовые операции имеются, и счас думал ну раз в А2 все работает...  а оно вона как, Михалыч...

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #78 : Сентябрь 25, 2012, 05:00:09 pm »
Если ничего не придумал, то как-то так:
VAR
  m: INTEGER :=1;
  bitCount: INTEGER :=0;

PROCEDURE SetNextBit ( VAR set: INTEGER, value: BOOLEAN );
DEGIN
  INC( bitCount );
  IF bitCount > 8 THEN bitCount := 1 END;
  IF bitCount = 1 THEN m := 1 ELSE m := m + m END;
  IF value THEN INC( set, m );
END SetNextBit;

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #79 : Сентябрь 25, 2012, 05:03:50 pm »
VAR
  m: INTEGER :=1;
  bitCount: INTEGER :=0;

PROCEDURE SetNextBit ( VAR set: INTEGER, value: BOOLEAN );
DEGIN
  IF bitCount > 8 THEN bitCount := 0 END;
  IF bitCount = 0 THEN m := 1 ELSE m := m + m END;
  IF value THEN INC( set, m );
  INC( bitCount );
END SetNextBit;

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #80 : Сентябрь 25, 2012, 07:06:26 pm »
Чегой-то не пойму, в чём трудности. Если в накоплении битов кода, то зачем их вообще накапливать?
Сразу преобразовывать в целое и считать кол-во битов.
пауза пришла - буква накопилась в виде кол-ва пришедших бит и преобразованного в целое.
А преобразование самое элементарное:
Изначально I:=0  и count:=0
С каждым пришедшим битом I:=I*2+пришедшее   и  count:=count+1
Ну и какое нибудь соглашение, что делать, если длина последовательности превысила допустимую.
Или считать, что всё есть лажа и ждать паузы, или продолжать накапливать в I но дополнить делением по модулю равному нужной степени двойки, чтобы I всегда соответствовало последним n битам


 

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #81 : Сентябрь 26, 2012, 03:05:26 am »
Использовать SYSTEM на ровном месте - не кошерно же :-)
Ты не учитываешь одну важнейшую вещь! Оберон - язык для SYSTEMного программирования!!! Об этом все Тру-Обеонщики говорят. Истину глаголят

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #82 : Сентябрь 26, 2012, 03:13:48 am »
Чегой-то не пойму, в чём трудности. Если в накоплении битов кода, то зачем их вообще накапливать?
Сложности в том, что спотыкачь на ровном месте, когда для установки бита приходится использовать умножение+сложение или кучу сложений и плюс еще кучу дополнительных переменных. А учитывая, что в камне и умножения может не быть, и оперативной памяти там всего несколько БАЙТ... и это при наличии в языке нужных средств, но вот не работающих так, как надо, и работающих в других, производных языках/компиляторах...

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #83 : Сентябрь 26, 2012, 05:15:32 am »
На всякий случай сделаю ещё пояснения к http://oberspace.dyndns.org/index.php/topic,338.msg9162.html#msg9162
Пусть точка будет нулем , а тире - единицей. Каждый код в виде нулей и единиц рассматриваем как двоичное число (слева  старший разряд, справа младший), но иметь ввиду будем уже в виде преобразованного в целое.
Тогда однобитовые коды имеют значение 0 и 1, двухбитовые - от 0 до 7, трёхбитовые - от 0 до 15 и т .д
То есть каждому закодированному символу соответствует некое целое число и  к-во бит в коде.
Теперь сконструируем строку из символов.
Сначала все символы однобитовых кодов, целые значения которых возрастают от 0 до 1, затем символы двухбитовых кодов, целые значения которых упорядочены от 0 до 7 и т.д . Если некоторому целому  в n-битовом коде нет соответствующего символа, или вдруг этот код используется для передачи несимвольной информации, то можно выбрать символы например нижнего регистра для представления этих кодов. Например маленькую 'x' для недопустимого кода.
Вот так и получилась строка в конце того сообщения. А для удобства, чтобы руками и глазами коды не мусолить, можно использовать картинку дерева из сообщения http://oberspace.dyndns.org/index.php/topic,338.msg9137.html#msg9137


 

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #84 : Сентябрь 26, 2012, 06:51:36 am »
Что-то я не догоняю, как народ собирается различать 0, 00, 000, 0000 и т.д.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #85 : Сентябрь 26, 2012, 07:01:40 am »
Что-то я не догоняю, как народ собирается различать 0, 00, 000, 0000 и т.д.
Надо бы уточнить какой народ и где различать. У меня проблем нет :)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #86 : Сентябрь 26, 2012, 07:39:45 am »
Что-то я не догоняю, как народ собирается различать 0, 00, 000, 0000 и т.д.
В этом нет проблемы - мы всегда знаем длину последовательности, которая определяет поддиапазон. Соотвественно из массива мы можем получить букву(декодировать) например так: массив[длинапоследовательности][последовательность]

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #87 : Сентябрь 26, 2012, 07:49:13 am »
Тогда однобитовые коды имеют значение 0 и 1, двухбитовые - от 0 до 7, трёхбитовые - от 0 до 15 и т .д
Оговорка вышла.
Конечно так:

Тогда однобитовые коды имеют значение 0 и 1, двухбитовые - от 0 до 3, трёхбитовые - от 0 до 7 и т .д

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #88 : Сентябрь 26, 2012, 08:39:28 am »
Это обычно делается не в декодере (который оперирует уже бинарными данными), то есть не в конечном автомате, а в узле что данные "бинаризует". В DSP-модуле.

В моей архитектуре декодер - это как раз DSP. А с декодером в ваших терминах у меня работа идёт через Writer. Т.е. подразумевается, что Writer - это интерфейс к тому компоненту, который занимается раскодированием азбуки Морзе и дальнейшим применением полученного текста.

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #89 : Сентябрь 26, 2012, 05:41:46 pm »
Поправьте, если ошибаюсь:

Код: (delphi) [Выделить]
BitSets: ARRAY 32 OF SET;

BitSets[0] := {0};
...
BitSets[31] := {31};

VAR
  Bits: SET;
  BitN: INTEGER;

BEGIN
  ...
  // Установим-ка BitN-ый бит в Bits
  Bits := Bits + BitSets[BitN];
  // Готово, проверим, установлен ли бит BitN
  IF (Bits * BitSets[BitN]) # {} THEN
     // Да, установлен
  END;
END Test.