Подкиньте, пожалуйста, мыслю: при работе с ИК приемником получаю команды от пульта вида
code_25092.txt
вида "импульс/пауза|длительность импульса". Разделитель вписываю сам какой душа пожелала. Дальше, получая этакий массивчик этих импульсов, запоминаю его. Затем нажимаю ту-же кнопку на пульте и получаю такой же набор импульсов/пауз, но длительность импульса должна иметь допуск в 0,14. Именно с таким разбросом большинство бытовых пультов выплевывают импульсы.
Так вот, записывая первый образец в память, я потом с ним сравниваю последующие сигналы, при этом каждая строка в массиве должна иметь допуск в эти 0,14 по длительности импульса/паузы. В единичном варианте это делаю через перебор значений каждого из массивов (сравниваю новый сигнал с эталонным) с вычитанием длительности от эталонного, и пропусканием этого числа через if_elce "X<=0.14". Если все значения вложились в этот коридор с допуском в 0.14 - сигналы совпадают, а если есть хоть 1 разность больше 0.14 - нажимались разные кнопки пульта.
Теперь хочу упаковать это в модуль скоростного поиска, поскольку часть пультов выплевывают всякую бяку вперемешку с чистым сигналом очень часто. Приходится проверять каждый сигнал на соответствие эталону примерно раз в 25 миллисекунд. Первое что подумал - загнать в SQLite эталоны и дальше просто делать поиск по ней с поступлением нового сигнала от пульта, но ведь нужно же учитывать этот самый допуск в 0.14 при поиске и массив нужно перебрать в строку для записи в базу...
Думается мне что я не самый рациональный способ придумал. Может кто подкинет свежую мыслю для сравнения сигналов?
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
|
|||
карма: 0 |
| ||
файлы: 1 | code_25092.txt [418B] [111] |
Ответов: 3889
Рейтинг: 362
|
|||
Аппроксимировать. То есть делитьокруглять "сырые" числа, что бы варианты чисел (замеры одного и того же интервала) из допустимых пределов, пройдя аппроксимацию, давали один и тот же результат, уже его искатьсравнивать.
|
|||
карма: 1 |
|
Ответов: 704
Рейтинг: 7
|
|||
1nd1g0, сия мысль меня посещала, но эффективно это нашел если разность сигналов отсчитывать относительно какой-то кнопки из пульта. То есть получаю при сравнении 2 кнопок примерно такое: строка 15 - импульс, строка 29 - пауза, строка 69 - пауза. И так все остальные кнопки, которые все отличаются от первой. Получается что-то 68*0-35:0-37:0-39:0-51:0-53:0-55, где "число строк*пауза/импульс-длительность:пауза/импульс-длительность:...". Но так теряется 1 кнопка из пульта, поскольку если сравнить ее с любой другой - она даст тот же результат при вычитании.
|
|||
карма: 0 |
|
Ответов: 8928
Рейтинг: 823
|
|||
Neo, эти 52 строчки, которые Вы привели -- одна кнопка, или несколько?
------------ Дoбавленo в 14.13: Приведите пример 5 нажатий одной кнопки, а лучше по 5 нажатий каждой кнопки. |
|||
карма: 19 |
|
Ответов: 704
Рейтинг: 7
|
|||
Леонид, это одна кнопка с одного пульта (от телевизора ) . От тюнера одна кнопка дает другое количество строк, от монитора видео наблюдения дает 68 строк, от пульта кондишки тоже 68...
Пример 5 нажатий каждой 1 кнопки http://www.hiasm.com/xf/attach/share/Книга1.jpg - сохранив, поменяйте расширение на csv |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Neo,
1. то что ты привел в code_25092.txt, это два нажатия одной кнопки (начало - 1|2.5 конец посылки 0|17.5). Внимательно посмотри. Если смотреть лень - подключи ИК-приемник к звуковухе и послушай. 2. чем мерял интервалы ? 3. все пульты стабилизированы кварцем. 4. Разбега даже в 0.14 физически быть не может. Судя по всему - это погрешность измерений. ------------ Дoбавленo в 14.59: Леонид, в сигнале от пультов информацию несут последних 8 бит (на пульте 255 кнопок не бывает ). Информация в начале посылки "Тип аппарата, модель и т.д. или номер пульта" для процессора аппарата, чтобы он даже не пытался декодидовать сигналы с чужих пультов. |
|||
карма: 25 |
|
Ответов: 704
Рейтинг: 7
|
|||
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 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Neo писал(а): дает разность и в первых 10 строках.Есть так называемые "универсальные" пульты, которые старательно перебирают известные им индентификаторы. Обычно они выдают целую серию команд на одно нажатие. А вообще у китайцев жёсткого стандарта нет, могут и задом-наперёд пакеты слатьпринимать, и плюс к минусу припаивать. И даже работать будет, пока поблизости чужое оборудование не окажется... |
|||
карма: 1 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Neo, есть пульты у которых длинная пауза - это 1, а короткая пауза - это 0. Всё на свете относительно
|
|||
карма: 25 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Что-то я уже такое где-то видел на этом форуме, и пример даже делал для народа.
|
|||
карма: 22 |
|
Ответов: 704
Рейтинг: 7
|
|||
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 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
1. Образцы пишешь в "стационарную" БД.
2. При запуске программы создаёшь вторую БД в памяти по образу и подобию "стационарной" БД 3. INSERT INTO <таблица в памяти> SELECT * FROM <таблица стационарная> 4. Работаешь только с <таблицей в памяти>. А это скорость. 5. Поиск с допуском - волшебное слово BETWEEN |
|||
карма: 25 |
|
Ответов: 704
Рейтинг: 7
|
|||
Tad, думаю таблица в памяти - лишнее. В этой программке не будет большого наплыва. Точнее не будет сложной обработки данных после таблицы. Это я Вам кровь стаканами пил с потоками в другой программе с БД
А про волшебное слово сейчас погуглю, но ведь параметры будут в одну строку, а не массивом записаны ------------ Дoбавленo в 16.36: Tad, а разве этот BETWEEN в sqlite работает? |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Работает.
Neo писал(а): думаю таблица в памяти - лишнее1. хотя бы для BetWeen 2. Neo писал(а): мне нужно только сопоставить принятие данные с эталоном и получить реакцию на совпадение3. Neo писал(а): В этой программке не будет большого наплыва. Читать советы нужно вдумчиво. |
|||
карма: 25 |
|
Ответов: 704
Рейтинг: 7
|
|||
Tad, но мне не нужно ничего писать - только искать - это мизерное время.
А как его загнать, этот эталон?! Массив же я не введу туда, а если сведу массив в строку - как я его буду BetWeen сравнивать? Про него вообще в SQLite ничего нет. |
|||
карма: 0 |
|