реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Интегрирование показаний датчика на С, как правильно?
smk
сообщение Aug 8 2012, 15:33
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Мне нужно проинтегрировать показания датчика. Сами показания измеряются АЦП контроллера с дискретностью в 2 миллисекунды. Как я понимаю это должно быть численное интегрирование по методу трапеций. Начальное значение (обычно "а" в формулах) равно 0, как я понимаю. Количество проделанных измерений я могу посчитать. Это, как я понимаю будет "b" и "N" одновременно. Соответственно "h" получится всегда равно 1. А значит само интегрирование сведется к подсчету среднеарифметических значений между соседними замерами и их последующее суммирование? Наверняка я что-то понимаю не так. Если кто уже делал подобное, подскажите как правильно. Код я наверняка сам напишу, мне бы быть уверенным что алгоритм верный. Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 8 2012, 15:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(smk @ Aug 8 2012, 18:33) *
Мне нужно проинтегрировать показания датчика.

Почему нельзя просто просуммировать N отсчётов?
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Aug 8 2012, 16:46
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(smk @ Aug 8 2012, 18:33) *
Мне нужно проинтегрировать показания датчика. Сами показания измеряются АЦП контроллера с дискретностью в 2 миллисекунды. Как я понимаю это должно быть численное интегрирование по методу трапеций.

Почему именно этот метод выбран? Есть какие-нибудь аргументы?
Лично мне за много лет работы с данными на практике хватает двух методов: усреднение и медианный фильтр. Но это может зависеть от данных, какова специфика датчика и какие помехи нужно побороть.
Go to the top of the page
 
+Quote Post
xemul
сообщение Aug 8 2012, 17:11
Сообщение #4



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



На пальцах (или бумажке) несложно подсчитать, что разность суммы линейных интерполяций (N+1) отсчётов и простой суммы N отсчётов равна половине разности крайних отсчётов.
Никаких дополнительных плюсов (н-р, в подавлении помех) этот наворот не даст.
Если нужно обрезать полосу с минимальными затратами, то целочисленное скользящее среднее (с правильным округлением).
Если же ФНЧ 1-го порядка недостаточно, то ... нужно считать.
Go to the top of the page
 
+Quote Post
smk
сообщение Aug 8 2012, 18:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(Ruslan1 @ Aug 8 2012, 19:46) *
Почему именно этот метод выбран? Есть какие-нибудь аргументы?
Лично мне за много лет работы с данными на практике хватает двух методов: усреднение и медианный фильтр. Но это может зависеть от данных, какова специфика датчика и какие помехи нужно побороть.

Сигнал с датчика по форме напоминает колокол с очень растянутым правым краем. Производитель датчиков рекомендует применять интегрирование.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Aug 9 2012, 03:51
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(smk @ Aug 8 2012, 19:33) *
Мне нужно проинтегрировать показания датчика.
Если кто уже делал подобное, подскажите как правильно. Код я наверняка сам напишу, мне бы быть уверенным что алгоритм верный. Спасибо.

Нам отсюда не видно, как меняется там что-то там. Но могу уверенно сказать, что величина интеграла не должна зависеть от выбора алгоритмического языка. Си тут не имеет преимущества по точности вычислений. Или я ошибаюсь...
Все эти трапеции, прямоугольники и др. интерполяции-аппроксимации при численном интегрировании обычно применяются для повышения точности интегрирования для относительно редко стоящих точек. И дадут скорее всего у Вас одинаковый результат.

Цитата(Ruslan1 @ Aug 8 2012, 20:46) *
Лично мне за много лет работы с данными на практике хватает двух методов: усреднение и медианный фильтр. Но это может зависеть от данных, какова специфика датчика и какие помехи нужно побороть.

У Вас много лет не было практики со спектральными приборами или хроматографами там разными...
Это не помехи бороть, а весь полезный сигнал собрать.
Go to the top of the page
 
+Quote Post
smk
сообщение Aug 9 2012, 06:47
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(Tanya @ Aug 9 2012, 06:51) *
Это не помехи бороть, а весь полезный сигнал собрать.

Совершенно верно. Т.е. я так понимаю, что нужно суммировать предидущее и текущее значения, делить их на 2, а результат накапливать в переменной в виде суммы всех вышеупомянутых среднеарифметических?

Кстати, попутно вопрос. Как с помощью printf вывести unsigned long (напр. 12123123)? Или лучше объявить как float? Тогда выводится правильно.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Aug 9 2012, 07:06
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Tanya @ Aug 9 2012, 06:51) *
У Вас много лет не было практики со спектральными приборами или хроматографами там разными...
Это не помехи бороть, а весь полезный сигнал собрать.

Абсолютно именно так. Мы люди простые, коллайдеры не делаем, лазеры-шмазеры не пользуем sm.gif
По этой причине уже на уровне подсознания "интегрирование показаний" у меня автоматически транслируется в "усреднение показаний". Издержки окружающей среды, извиняюсь. Везде только фильтры мерещатся sm.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 9 2012, 07:07
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(smk @ Aug 9 2012, 09:47) *
Как с помощью printf вывести unsigned long (напр. 12123123)?

Код
#include <inttypes.h> // само включит <stdint.h>
#include <stdio.h>

int main()
{
        uint64_t foo = 12123123ULL;
        printf( "foo = %" PRId64 "\n", foo);
        return 0;
}

Это даст правильный результат где угодно.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
smk
сообщение Aug 9 2012, 07:24
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(ReAl @ Aug 9 2012, 10:07) *
Это даст правильный результат где угодно.

Спасибо.

По интегрированию еще бы так...


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Aug 9 2012, 07:41
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(smk @ Aug 9 2012, 11:24) *
По интегрированию еще бы так...

А блюдечко с голубой каемочкой приготовили?
Вы же обещали сами написать...
В чем суть вопроса Вашего?
Численное интегрирование не проблема. Проблема в том, чтобы правильно выделить пик, который нужно интегрировать. В общем случае...
Вот пока еще нет пика есть некий фон - какая-то неизвестная кривуля. Или прямуля.
Ее нужно правильно выделить. Второе - нужно отрезать хвост. Иначе наинтегрируем до бесконечности. И нос нужно правильно найти.
Есть еще небольшие тонкости связанные с конечной разрядностью и накоплением ошибки вычислений.
Go to the top of the page
 
+Quote Post
smk
сообщение Aug 9 2012, 13:32
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Суть вопроса в том, что игра чисел предельно упрощает вычисления и это подозрительно. Хотелось бы услышать мнение относительно верности выбранного алгоритма (см пост 1).


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Aug 9 2012, 15:17
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(smk @ Aug 9 2012, 17:32) *
Суть вопроса в том, что игра чисел предельно упрощает вычисления и это подозрительно. Хотелось бы услышать мнение относительно верности выбранного алгоритма (см пост 1).

Тут двух мнений быть не может.
Нарисуйте на бумажке не очень кривую кривую.... Разбейте ее в точках оцифровки вертикальными линиями и вспомните, чему равна площадь трапеции... прямоугольника... треугольника. Как сумма этих площадей будет отличаться от площади под кривой?
Некоторые древние авторы проводили не через 2, а через три (четыре... ) точки многочлен... соответствующего порядка. Там формулы немного сложнее.
Go to the top of the page
 
+Quote Post
xemul
сообщение Aug 9 2012, 15:34
Сообщение #14



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(smk @ Aug 9 2012, 17:32) *
Суть вопроса в том, что игра чисел предельно упрощает вычисления и это подозрительно.

Не понял, про какую игру Вы говорите.
На примере 4-ёх отсчётов:
сумма линейных интерполяций
(a0 + a1)/2 + (a1 + a2)/2 + (a2 + a3)/2 = a1 + a2 + (a0 + a3)/2
разность её и простой суммы
(a1 + a2 + (a0 + a3)/2) - (a0 + a1 + a2) = (a3 - a0)/2
Цитата
Хотелось бы услышать мнение относительно верности выбранного алгоритма (см пост 1).

Абсолютно верный алгоритм.
Если интересует предельное упрощение, то абсолютно тот же результат будет получен, если к простой сумме (N-1) отсчётов Вы добавите (aN - a0)/2.
На всякий случай: если aN == a0, то ...
Go to the top of the page
 
+Quote Post
Д.К.
сообщение Aug 23 2012, 19:39
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 23-08-12
Пользователь №: 73 232



Цитата(smk @ Aug 8 2012, 18:33) *
Мне нужно проинтегрировать показания датчика. Сами показания измеряются АЦП контроллера с дискретностью в 2 миллисекунды. Как я понимаю это должно быть численное интегрирование по методу трапеций. Начальное значение (обычно "а" в формулах) равно 0, как я понимаю. Количество проделанных измерений я могу посчитать. Это, как я понимаю будет "b" и "N" одновременно. Соответственно "h" получится всегда равно 1. А значит само интегрирование сведется к подсчету среднеарифметических значений между соседними замерами и их последующее суммирование? Наверняка я что-то понимаю не так. Если кто уже делал подобное, подскажите как правильно. Код я наверняка сам напишу, мне бы быть уверенным что алгоритм верный. Спасибо.


По поводу взятия интеграла можно посмотреть исходники http://alglib.sources.ru/
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016