Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
#1: 2011-09-06 13:36:26 ЛС | профиль | цитата
Подкиньте, пожалуйста, мыслю: при работе с ИК приемником получаю команды от пульта вида
code_25092.txt
вида "импульс/пауза|длительность импульса". Разделитель вписываю сам какой душа пожелала. Дальше, получая этакий массивчик этих импульсов, запоминаю его. Затем нажимаю ту-же кнопку на пульте и получаю такой же набор импульсов/пауз, но длительность импульса должна иметь допуск в 0,14. Именно с таким разбросом большинство бытовых пультов выплевывают импульсы.
Так вот, записывая первый образец в память, я потом с ним сравниваю последующие сигналы, при этом каждая строка в массиве должна иметь допуск в эти 0,14 по длительности импульса/паузы. В единичном варианте это делаю через перебор значений каждого из массивов (сравниваю новый сигнал с эталонным) с вычитанием длительности от эталонного, и пропусканием этого числа через if_elce "X<=0.14". Если все значения вложились в этот коридор с допуском в 0.14 - сигналы совпадают, а если есть хоть 1 разность больше 0.14 - нажимались разные кнопки пульта.
Теперь хочу упаковать это в модуль скоростного поиска, поскольку часть пультов выплевывают всякую бяку вперемешку с чистым сигналом очень часто. Приходится проверять каждый сигнал на соответствие эталону примерно раз в 25 миллисекунд. Первое что подумал - загнать в SQLite эталоны и дальше просто делать поиск по ней с поступлением нового сигнала от пульта, но ведь нужно же учитывать этот самый допуск в 0.14 при поиске и массив нужно перебрать в строку для записи в базу...

Думается мне что я не самый рациональный способ придумал. Может кто подкинет свежую мыслю для сравнения сигналов?
карма: 0

0
файлы: 1code_25092.txt [418B] [111]
Ответов: 3889
Рейтинг: 362
#2: 2011-09-06 13:44:24 ЛС | профиль | цитата
Аппроксимировать. То есть делитьокруглять "сырые" числа, что бы варианты чисел (замеры одного и того же интервала) из допустимых пределов, пройдя аппроксимацию, давали один и тот же результат, уже его искатьсравнивать.
карма: 1

0
Ответов: 704
Рейтинг: 7
#3: 2011-09-06 13:58:59 ЛС | профиль | цитата
1nd1g0, сия мысль меня посещала, но эффективно это нашел если разность сигналов отсчитывать относительно какой-то кнопки из пульта. То есть получаю при сравнении 2 кнопок примерно такое: строка 15 - импульс, строка 29 - пауза, строка 69 - пауза. И так все остальные кнопки, которые все отличаются от первой. Получается что-то 68*0-35:0-37:0-39:0-51:0-53:0-55, где "число строк*пауза/импульс-длительность:пауза/импульс-длительность:...". Но так теряется 1 кнопка из пульта, поскольку если сравнить ее с любой другой - она даст тот же результат при вычитании.
карма: 0

0
Ответов: 8928
Рейтинг: 823
#4: 2011-09-06 14:13:11 ЛС | профиль | цитата
Neo, эти 52 строчки, которые Вы привели -- одна кнопка, или несколько?
------------ Дoбавленo в 14.13:
Приведите пример 5 нажатий одной кнопки, а лучше по 5 нажатий каждой кнопки.
карма: 19

0
Ответов: 704
Рейтинг: 7
#5: 2011-09-06 14:49:35 ЛС | профиль | цитата
Леонид, это одна кнопка с одного пульта (от телевизора ) . От тюнера одна кнопка дает другое количество строк, от монитора видео наблюдения дает 68 строк, от пульта кондишки тоже 68...
Пример 5 нажатий каждой 1 кнопки http://www.hiasm.com/xf/attach/share/Книга1.jpg - сохранив, поменяйте расширение на csv

карма: 0

0
Ответов: 16884
Рейтинг: 1239
#6: 2011-09-06 14:59:08 ЛС | профиль | цитата
Neo,
1. то что ты привел в code_25092.txt, это два нажатия одной кнопки (начало - 1|2.5 конец посылки 0|17.5). Внимательно посмотри. Если смотреть лень - подключи ИК-приемник к звуковухе и послушай.
2. чем мерял интервалы ?
3. все пульты стабилизированы кварцем.
4. Разбега даже в 0.14 физически быть не может. Судя по всему - это погрешность измерений.


------------ Дoбавленo в 14.59:
Леонид, в сигнале от пультов информацию несут последних 8 бит (на пульте 255 кнопок не бывает ). Информация в начале посылки "Тип аппарата, модель и т.д. или номер пульта" для процессора аппарата, чтобы он даже не пытался декодидовать сигналы с чужих пультов.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 704
Рейтинг: 7
#7: 2011-09-06 15:18:19 ЛС | профиль | цитата
Tad, да, действительно 2 нажатия влепил на форум.
Сигнал принимаю с приблуды от irlink. Там стоит микруха и что-то для декодинга в порт (мол улучшает качество приема). Ну это не суть. Интервал считал по этой таблице http://www.irlink.ru/support/api.jsp.
Сам разброс в 0,14 может и погрешность, но появляется эта погрешность на всех заюзаных мною пультах при помехах на пути сигнала или при приеме отраженного сигнала. Суть не меняется - все кнопки дают при сравнении красивые сигналы типа "111-----111, 1-1-1-------1-1-1 и т.д.".
Про информацию вначале посылки: не уверен, но 1 пульт мне попался, который дает разность и в первых 10 строках, и так все кнопки на нем. Хотя все остальные пульты дают разность только последних 20-30 строках.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#8: 2011-09-06 15:24:48 ЛС | профиль | цитата
Neo писал(а):
дает разность и в первых 10 строках.

Есть так называемые "универсальные" пульты, которые старательно перебирают известные им индентификаторы. Обычно они выдают целую серию команд на одно нажатие. А вообще у китайцев жёсткого стандарта нет, могут и задом-наперёд пакеты слатьпринимать, и плюс к минусу припаивать. И даже работать будет, пока поблизости чужое оборудование не окажется...
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#9: 2011-09-06 15:32:15 ЛС | профиль | цитата
Neo, есть пульты у которых длинная пауза - это 1, а короткая пауза - это 0. Всё на свете относительно
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#10: 2011-09-06 15:34:36 ЛС | профиль | цитата
Что-то я уже такое где-то видел на этом форуме, и пример даже делал для народа.
карма: 22

0
Ответов: 704
Рейтинг: 7
#11: 2011-09-06 15:49:12 ЛС | профиль | цитата
nesco, так и есть, Вы и дали мне пинка к расшифровке этого безобразия. Но теперь проблема в записи всего этого для поиска.
------------ Дoбавленo в 15.37:
А именно поиска с допуском в 0,14
------------ Дoбавленo в 15.38:
Tad, это неважно. Пусть хоть 3 нуля. Главное чтоб это можно было найти с допуском погрешности.
------------ Дoбавленo в 15.40:
мне нужно только сопоставить принятие данные с эталоном и получить реакцию на совпадение. Посылать сигнал для техники (в случае необходимости) я буду в виде отправки записанного эталона - что там закодировано, это неважно, оно само поймет.
------------ Дoбавленo в 15.41:
Tad писал(а):
длинная пауза - это 1, а короткая пауза - это 0
да и такого барахла мне пока не попадалось (перебрал все доступные у себя пульты) - собственно проблема не стоит.
------------ Дoбавленo в 15.49:
Если б не эта погрешность, слал бы в базу все строкой и не задумывался бы, а так нужно с учетом погрешности.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#12: 2011-09-06 15:58:03 ЛС | профиль | цитата
1. Образцы пишешь в "стационарную" БД.
2. При запуске программы создаёшь вторую БД в памяти по образу и подобию "стационарной" БД
3. INSERT INTO <таблица в памяти> SELECT * FROM <таблица стационарная>
4. Работаешь только с <таблицей в памяти>. А это скорость.
5. Поиск с допуском - волшебное слово BETWEEN

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 704
Рейтинг: 7
#13: 2011-09-06 16:36:30 ЛС | профиль | цитата
Tad, думаю таблица в памяти - лишнее. В этой программке не будет большого наплыва. Точнее не будет сложной обработки данных после таблицы. Это я Вам кровь стаканами пил с потоками в другой программе с БД
А про волшебное слово сейчас погуглю, но ведь параметры будут в одну строку, а не массивом записаны
------------ Дoбавленo в 16.36:
Tad, а разве этот BETWEEN в sqlite работает?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#14: 2011-09-06 16:47:58 ЛС | профиль | цитата
Работает.
Neo писал(а):
думаю таблица в памяти - лишнее
не лишняя,
1. хотя бы для BetWeen
2.
Neo писал(а):
мне нужно только сопоставить принятие данные с эталоном и получить реакцию на совпадение
вот я тебе и толкую - загони эталон в память и сопоставляй на хорошей скорости.
3.
Neo писал(а):
В этой программке не будет большого наплыва.
А я тебе и не советовал наплыв писать в память
Читать советы нужно вдумчиво.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 704
Рейтинг: 7
#15: 2011-09-06 18:26:33 ЛС | профиль | цитата
Tad, но мне не нужно ничего писать - только искать - это мизерное время.
А как его загнать, этот эталон?! Массив же я не введу туда, а если сведу массив в строку - как я его буду BetWeen сравнивать? Про него вообще в SQLite ничего нет.
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)