Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Выбор значения многозначной функции

Ответить
Настройки темы
Теория - Выбор значения многозначной функции

Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте.

Существует ИК дальномер SHARP, который можно подключить к ЦАП и в зависимости от расстояния до объекта будет изменяться напряжение на выходе дальномера. Зависимость напряжения не только нелинейная, но и с "крохотным" изъяном :



Отградуировав свой дальномер я получил похожую зависимость и пока у меня нет предположений как можно грамотно обработать получаемые данные. К примеру получив на выходе 1 Вольт, по графику видно что функция имеет два значения расстояния: 5 см и 65 см. Как вы наверное понимаете препятствие может возникнуть как на 5 так и на 65 сантиметрах. Отслеживать предыдущее значение расстояния по-моему неправильно из-за некоторого количества ошибок самого дальномера.

Посоветуйте пожалуйста оптимальный алгоритм для обработки данных.

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 13:51, 10-07-2012

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 995

Профиль | Сайт | Отправить PM | Цитировать


По поводу шаговых двигателей.
FDD. Там червячная передача, да и "платформа" уже имеется.
Дальномер на ней закрепить и все. (габаритные размеры последнего не выяснял)

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 21:41, 15-07-2012 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Beyound, Дисперсия превышена в sqrt(999) раз - просто в формуле ошиблись. И с расстоянием может не расти, если это шум самого датчика или усилителя (пытаемся это выяснить). Если будет расти - это то, что нужно. Изначально по дисперсии планировалось отделить область до и после пика при замере дальности.
Цитата lxa85:
FDD »
матричный принтер круче (формата a3 особенно)!

Отправлено: 23:33, 15-07-2012 | #22


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt exp_value_10.txt
(17.6 Kb, 14 просмотров)
Тип файла: txt exp_value_15.txt
(17.6 Kb, 13 просмотров)

Цитата pva:
Стандартная процедура замеры плотности распределения такая (почти как ты описал):
1. записывается сигнал, дофига независимых отсчётов.
2. вещественная ось делится на равные отрезки (чем длинее отрезок - тем глаже, но меньше точек в гистограмме)
3. вычисляется сколько точек попали в каждый отрезок. »
Учитывая что значения строго дискретны у меня и получилось плотность распределения.

Цитата pva:
Мне понравились расстояния 10 и 15 см, потому что там явный скачок и провал ср-кв. отклонения. В идеале было бы хорошо посмотреть "типичный" сингал и "сильное отклонение от нормы", а расстояние любое от 10 до 30 см. »
Прикрепляю измерения на 10 и 15 см. Частота измерений 200 Гц. Набирал до 3000 событий.

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 11:11, 16-07-2012 | #23


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178

Профиль | Отправить PM | Цитировать


Цитата pva:
Дисперсия превышена в sqrt(999) раз - просто в формуле ошиблись »
В том месте где среднее неправильно посчитали?

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 11:14, 16-07-2012 | #24

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png bitmap.PNG
(7.0 Kb, 15 просмотров)
Тип файла: png quant.PNG
(9.8 Kb, 15 просмотров)
Тип файла: png fourier.PNG
(16.2 Kb, 16 просмотров)
Тип файла: png autocorr.PNG
(17.8 Kb, 15 просмотров)

Цитата Tonny_Bennet:
В том месте где среднее неправильно посчитал »
Среднее вроде везде правильно было.
В общем, немного понятно, почему так прыгает дисперсия. При удалении от пика в низким напряждениям начинается совсем не гауссово поведение.

1. В сигнале присуствует независимая от расстояния периодическая помеха (возможно напряжение питания, но частота слишком низкая, около 20 Гц. Её можно увидеть по повторяющимся пикам на частотной диаграмме.
2. В области низких напряжений (см. quant.png) есть "дыры" (2 шт), в которые не попадают значения. Причём её форма зависит от дальности. Нужно посмотреть, как они ведут себя на разных расстояниях - возможно это тот фактор, который мы ищем. Ещё интересно, что происходит с областью низких напряжений при переходе через пик среднего значения напряжения при приближении к препятствию.

Рекомендации будут такие:
1. определять расстояние не по среднему, а по моде (это точка, где максимальное значение плотности вероятности).
2. Пройтись по всему диапазону, можно снимать по 500 точек, и посмотреть, как ведёт себя область ниже моды. Должно быть хорошо видно на графике плотности (как bitmap.png), квантилей (quant.png), поведение периодической помехи может покажет фурье (fourier.png)
или автокореляция (autocorr.png).


у меня почему-то плотность распределния получилась гораздо симметричней, чем у тебя. Ты накладывал преобразование на данные?

Отправлено: 16:56, 16-07-2012 | #25


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178

Профиль | Отправить PM | Цитировать


Цитата pva:
1. определять расстояние не по среднему, а по моде (это точка, где максимальное значение плотности вероятности). »
Для этого нужно набирать некоторую статистику в момент измерения. У меня начали возникать некоторые проблемы с алгоритмом. Немного позже подробнее расскажу в чём именно.

Цитата pva:
2. Пройтись по всему диапазону, можно снимать по 500 точек, и посмотреть, как ведёт себя область ниже моды. »
Потребуется некоторое время для измерений.

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 10:19, 17-07-2012 | #26


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178

Профиль | Отправить PM | Цитировать


Цитата pva:
у меня почему-то плотность распределния получилась гораздо симметричней, чем у тебя. Ты накладывал преобразование на данные? »
Нет, преобразований не делал

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 10:36, 17-07-2012 | #27


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178

Профиль | Отправить PM | Цитировать


Столкнулся с проблемой.

Есть экземпляр ком-порта через который происходит обмен данными с модулем. Если я устанавливаю определённой командой автоопрос линии АЦП с заданной частотой, данные из модуля лезут сами. Добавляю обработчик событий ComPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived); в котором разбираю строки, пришедшие из порта и записываю данные в экземпляр некоторого класса Adc. Соответственно все расчёты (расстояния и т.д.) я провожу с экземпляром класса Adc. Что бы реализовать систему расчёта расстояния исходя не из текущего значения а из

Цитата pva:
определять расстояние не по среднему, а по моде (это точка, где максимальное значение плотности вероятности). »
Я решил добавить в класс очередь в которой хранить последние N значений.

Код: Выделить весь код
        public int Value
        {
            get { return _value; }
            set
            {
                _value = value;
                if (_hist_of_value.Count >= 1000)
                {
                    var a = _hist_of_value.Dequeue();
                }
                _hist_of_value.Enqueue(value);
            }
        }

        private Queue<int> _hist_of_value = new Queue<int>(1000);
       
        public int[] HistValue
        {
            get 
            {
                return _hist_of_value.ToArray();
            }
        }
Добавил поле, которое должно вернуть последние значения в виде целочисленного массива.

Написал новую процедуру расчёта расстояния. Она должна построить плотность распределения исходя из последних N измерений и найдя максимальное значение, посчитать и вернуть расстояние.

Код: Выделить весь код
  Dictionary<int, int> chanals = new Dictionary<int, int>();

                for (int i = 0; i < adc.HistValue.Length; i++)
                {

                    try
                    {
                        chanals[adc.HistValue[i]] += 1;
                    }
                    catch (KeyNotFoundException)
                    {
                        chanals.Add(adc.HistValue[i], 1);
                    }

                }
При запуску стали возникать ошибки в месте chanals.Add(adc.HistValue[i], 1); " Элемент с тем же ключом уже был добавлен." У меня и сейчас мало предположений почему если нет ключа процедура отработала блок try {} и потом вызвала ошибку. Единственное, что может прийти в голову так это то, что в процедуру подсчёта расстояния передаётся ссылка на объект Adc а не его копия на момент вызова, и за время проверки try {} объект успевает измениться и возникает исключение.

Подскажите пожалуйста в чём может быть проблема.

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Последний раз редактировалось Tonny_Bennet, 18-07-2012 в 12:34.


Отправлено: 12:26, 18-07-2012 | #28

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Судя по коду ты используешь C#. Я в нём начинающий, могу на общих основаниях сказать что исключение может давать adc.HistValue[i], которую ты оба раза вызываешь.

Предлагаю изменить алгоритм таким образом:
1. Собираем статистику N точек (в обычный int[])
2. Сортируем по возрастанию (обычный Array.sort<int>())
3. Теперь задача найти самую длинную "горизонтальную палку" (обычный поиск максимума)
Можно с уверенностью утверждать, что распределение унимодально, и что мода достаточно сосредоточенная, поэтому можно смело отбрасывать "палки" короче какого-то заранее заданного процента от N (надо подобрать на глаз). Этих палок скорее всего не больше 2-х. Можно даже сделать сглаживание: расположить между этими палками, согласно отношению их длин.

Отправлено: 22:02, 18-07-2012 | #29


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178

Профиль | Отправить PM | Цитировать


Цитата pva:
Судя по коду ты используешь C#. Я в нём начинающий, могу на общих основаниях сказать что исключение может давать adc.HistValue[i], которую ты оба раза вызываешь. »
Да это С#.... и по-моему здесь проблема из-за того, что одну переменную изменяют в разных потоках... (по моему чтение из ком-порта это отдельный поток)
У специалистов бы проконсультироваться...

Цитата pva:
Предлагаю изменить алгоритм таким образом:
1. Собираем статистику N точек (в обычный int[])
2. Сортируем по возрастанию (обычный Array.sort<int>())
3. Теперь задача найти самую длинную "горизонтальную палку" (обычный поиск максимума) »
В принципе по похожему я работал, когда вышеопубликованную гистограмму делал. Но для повышения стройности кода и использования всех прелестей ООП возникло желание запихнуть некоторые вещи в описание класса.... а с желанием появились и ошибки.

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 00:00, 19-07-2012 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Выбор значения многозначной функции

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] В пункте "выбор столбцов в таблице" не все значения anivan Microsoft Windows 2000/XP 4 16-09-2011 12:56
Разное - [решено] Excel 2003 выбор текстового значения или заменить bygor1412 Microsoft Office (Word, Excel, Outlook и т.д.) 2 24-10-2010 03:09
C/C++ - Присвоение функции значения mrcnn Программирование и базы данных 4 07-11-2008 08:26
Значения параметров h00ligan Автоматическая установка Windows 2000/XP/2003 1 21-06-2005 12:23
Значения абривеатур Trojn Хочу все знать 11 21-05-2003 23:58




 
Переход