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

 
 
 
Reply to this topicStart new topic
> ADSP усреднение на лету, Как усреднять принятые значения на лету
uriy
сообщение Dec 27 2005, 12:43
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Через SPORT принимаютя отсчеты, нужно находить их среднее значение на лету. Количество отсчетов заранее не известно.
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Dec 27 2005, 20:21
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976



Попробуйте формулу

avg(i)=[(n-1)*avg(i-1)+x(i)]/n,
где
avg - среднее значение;
x - значение нового отсчета;
n - общее количество обработанных отсчетов.

После получения первого отсчета n=1, поэтому
avg(1) = [(1-1)*0 + x1]/1 = x1

После второго n=2:
avg(2) = [(2-1)*x1 + x2]/2 = (x1+x2)/2

и т.д.

Сообщение отредактировал Dr.NoA - Dec 27 2005, 20:21
Go to the top of the page
 
+Quote Post
vetal
сообщение Dec 27 2005, 22:30
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Если необходимо на лету, то подойдет система типа аккумулятор.
f(t)=(f(t-1)+x)/2 или f(t)=(f(t-1)+x)>>1, при t>0

Все отчеты и их количество в данном случае не надо запоминать, достаточно знать результат обработки предыдущего и значение вновь поступивших данных.

см. ниже.

Сообщение отредактировал vetal - Dec 28 2005, 07:36
Go to the top of the page
 
+Quote Post
MakSV
сообщение Dec 28 2005, 05:24
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 35
Регистрация: 28-11-05
Из: Krasnodar
Пользователь №: 11 473



Используй скользящее среднее в этом случае тебе потребуется предыдущее значение и полученное из них получишь скользящую (g+g2)/2=s1
(g2+g3)/2=s2
(gn-1+gn)/2=sn
Это по двум точкам, если будет желание можно и больше точек использовать
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 28 2005, 06:14
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(vetal @ Dec 28 2005, 04:30) *
Если необходимо на лету, то подойдет система типа аккумулятор.
f(t)=(f(t-1)+x)/2 или f(t)=(f(t-1)+x)>>1, при t>0

Все отчеты и их количество в данном случае не надо запоминать, достаточно знать результат обработки предыдущего и значение вновь поступивших данных.

Это разве среднее будет?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 28 2005, 06:25
Сообщение #6


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(urasinov @ Dec 27 2005, 18:43) *
Через SPORT принимаютя отсчеты, нужно находить их среднее значение на лету. Количество отсчетов заранее не известно.

Среднее - это по определению сумма всех значений отсчетов деленное на количество отсчетов. Т.е. придется складывать их в буфер и после каждого вновь поступившего пересчитывать. С суммированием пробем нет - просто к сумме, полученной на предыдущем этапе, добавлять вновь поступивший отсчет. А вот деление будет самым ресурсоемким, поскольку делить придется на произвольное число. В ADSP-21хх, насколько помню, есть аппаратная поддержка деления, выполняется за 16 тактов.

Если бы задача стояла (как обычно) в усреднении по некоторому известному количеству отсчетов, то тогда это решалось бы на основе циклического буфера, организуемого с помощью DAG, это штатный способ пропускания данных через фильтр. Но у Вас, похоже, другая задача, придется делить. Если количество отсчетов хоть и не известно, но ограничено и известен диапазон (например, количество неизвестно, но может быть от 14 до 41), то можно соптимизировать - найти обратные делителям (1/14..1/41), поместить их в таблицу и на рантайме выбирать из таблицы нужное значение и умножать на него. Будет намного шустрее.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
vetal
сообщение Dec 28 2005, 07:36
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Цитата(dxp @ Dec 28 2005, 09:14) *
Цитата(vetal @ Dec 28 2005, 04:30) *

Если необходимо на лету, то подойдет система типа аккумулятор.
f(t)=(f(t-1)+x)/2 или f(t)=(f(t-1)+x)>>1, при t>0

Все отчеты и их количество в данном случае не надо запоминать, достаточно знать результат обработки предыдущего и значение вновь поступивших данных.

Это разве среднее будет?


Стормозил. Нельзя одновременно делать 2 задачи.
тогда так:
а(t)=a(t-1)+x;
n++;
f(x)=a(t)/n;
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Dec 28 2005, 12:28
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976



Цитата(vetal @ Dec 28 2005, 10:36) *
Стормозил. Нельзя одновременно делать 2 задачи.
тогда так:
а(t)=a(t-1)+x;
n++;
f(x)=a(t)/n;


Кажется, это тоже самое что и я предлагал.
Go to the top of the page
 
+Quote Post
uriy
сообщение Dec 28 2005, 19:01
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



dxp
Да вариант с коэффициентами из таблицы мне понравился. Количество отсчетов у меня не превышает 64, т.е. можно сперва их принять а уж потом подсчитать среднее. Только мне не понятно откуда взялись цифры 14 и 41, по-моему ничто не мешает взять коэффициент 1/64 это не такая уж малая величина.
Но все же мне интересно если у меня отсчеты будут идти в количестве несокльких миллионов я же не буду их все складывать в буфер. Может возможно зная текущее среднее обновить его значение приняв следующий отсчет.
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Dec 28 2005, 20:23
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976



Цитата(urasinov @ Dec 28 2005, 22:01) *
Но все же мне интересно если у меня отсчеты будут идти в количестве несокльких миллионов я же не буду их все складывать в буфер. Может возможно зная текущее среднее обновить его значение приняв следующий отсчет.

Если речь идет о произвольном количестве отсчетов (например, несколько миллионов), то нужно использовать вариант vetal'а или мой, т.к. хранить нужно только 2 переменные. Разница просто в том, что у vetal необходимо хранить накопленную сумму всех отсчетов, поэтому рано или поздно произойдет переполнение. В моем варианте хранится текущее среднее, поэтому переполнения не будет, но требуется лишнее умножение. Вторая переменная для хранения - это количество обработанных отсчетов. Буферов никаких не надо.
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 29 2005, 06:08
Сообщение #11


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(urasinov @ Dec 29 2005, 01:01) *
dxp
Да вариант с коэффициентами из таблицы мне понравился. Количество отсчетов у меня не превышает 64, т.е. можно сперва их принять а уж потом подсчитать среднее.

Ну дык вот. Заводим массив со значениями 1/2...1/64, при приеме очередного отсчета добавляем его к сумме предыдущих, далее умножаем на значение из массива (значение какждый раз другое - следующее).

Цитата(urasinov @ Dec 29 2005, 01:01) *
Только мне не понятно откуда взялись цифры 14 и 41,

Да это к примеру просто привел.

Цитата(urasinov @ Dec 29 2005, 01:01) *
по-моему ничто не мешает взять коэффициент 1/64 это не такая уж малая величина.

Это значение будет годиться только для вычисления среднего по 64 отсчетам. Для 63 нужен будет коэффициент 1/63, для 62 - 1/62 и т.д. Т.е., как уже сказал выше, массив из таких значений. Он для ADSP-21хх небольшой, все должно получиться.

Цитата(urasinov @ Dec 29 2005, 01:01) *
Но все же мне интересно если у меня отсчеты будут идти в количестве несокльких миллионов я же не буду их все складывать в буфер. Может возможно зная текущее среднее обновить его значение приняв следующий отсчет.

Не надо никакой буфер. Все принятые отсчеты суммируюся, для них буфер не нужен. Если счет пойдет на миллионы, то делать массив коеффициентов тоже не варинат, придется честно делить. Только тут уж 16-разрядной арифметикой не обойдется.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

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

 


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


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