uriy 5 27 декабря, 2005 Опубликовано 27 декабря, 2005 · Жалоба Через SPORT принимаютя отсчеты, нужно находить их среднее значение на лету. Количество отсчетов заранее не известно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.NoA 0 27 декабря, 2005 Опубликовано 27 декабря, 2005 (изменено) · Жалоба Попробуйте формулу 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 и т.д. Изменено 27 декабря, 2005 пользователем Dr.NoA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 27 декабря, 2005 Опубликовано 27 декабря, 2005 (изменено) · Жалоба Если необходимо на лету, то подойдет система типа аккумулятор. f(t)=(f(t-1)+x)/2 или f(t)=(f(t-1)+x)>>1, при t>0 Все отчеты и их количество в данном случае не надо запоминать, достаточно знать результат обработки предыдущего и значение вновь поступивших данных. см. ниже. Изменено 28 декабря, 2005 пользователем vetal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MakSV 0 28 декабря, 2005 Опубликовано 28 декабря, 2005 · Жалоба Используй скользящее среднее в этом случае тебе потребуется предыдущее значение и полученное из них получишь скользящую (g+g2)/2=s1 (g2+g3)/2=s2 (gn-1+gn)/2=sn Это по двум точкам, если будет желание можно и больше точек использовать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 50 28 декабря, 2005 Опубликовано 28 декабря, 2005 · Жалоба Если необходимо на лету, то подойдет система типа аккумулятор. f(t)=(f(t-1)+x)/2 или f(t)=(f(t-1)+x)>>1, при t>0 Все отчеты и их количество в данном случае не надо запоминать, достаточно знать результат обработки предыдущего и значение вновь поступивших данных. Это разве среднее будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 50 28 декабря, 2005 Опубликовано 28 декабря, 2005 · Жалоба Через SPORT принимаютя отсчеты, нужно находить их среднее значение на лету. Количество отсчетов заранее не известно. Среднее - это по определению сумма всех значений отсчетов деленное на количество отсчетов. Т.е. придется складывать их в буфер и после каждого вновь поступившего пересчитывать. С суммированием пробем нет - просто к сумме, полученной на предыдущем этапе, добавлять вновь поступивший отсчет. А вот деление будет самым ресурсоемким, поскольку делить придется на произвольное число. В ADSP-21хх, насколько помню, есть аппаратная поддержка деления, выполняется за 16 тактов. Если бы задача стояла (как обычно) в усреднении по некоторому известному количеству отсчетов, то тогда это решалось бы на основе циклического буфера, организуемого с помощью DAG, это штатный способ пропускания данных через фильтр. Но у Вас, похоже, другая задача, придется делить. Если количество отсчетов хоть и не известно, но ограничено и известен диапазон (например, количество неизвестно, но может быть от 14 до 41), то можно соптимизировать - найти обратные делителям (1/14..1/41), поместить их в таблицу и на рантайме выбирать из таблицы нужное значение и умножать на него. Будет намного шустрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 28 декабря, 2005 Опубликовано 28 декабря, 2005 · Жалоба Если необходимо на лету, то подойдет система типа аккумулятор. 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.NoA 0 28 декабря, 2005 Опубликовано 28 декабря, 2005 · Жалоба Стормозил. Нельзя одновременно делать 2 задачи. тогда так: а(t)=a(t-1)+x; n++; f(x)=a(t)/n; Кажется, это тоже самое что и я предлагал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 28 декабря, 2005 Опубликовано 28 декабря, 2005 · Жалоба dxp Да вариант с коэффициентами из таблицы мне понравился. Количество отсчетов у меня не превышает 64, т.е. можно сперва их принять а уж потом подсчитать среднее. Только мне не понятно откуда взялись цифры 14 и 41, по-моему ничто не мешает взять коэффициент 1/64 это не такая уж малая величина. Но все же мне интересно если у меня отсчеты будут идти в количестве несокльких миллионов я же не буду их все складывать в буфер. Может возможно зная текущее среднее обновить его значение приняв следующий отсчет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.NoA 0 28 декабря, 2005 Опубликовано 28 декабря, 2005 · Жалоба Но все же мне интересно если у меня отсчеты будут идти в количестве несокльких миллионов я же не буду их все складывать в буфер. Может возможно зная текущее среднее обновить его значение приняв следующий отсчет. Если речь идет о произвольном количестве отсчетов (например, несколько миллионов), то нужно использовать вариант vetal'а или мой, т.к. хранить нужно только 2 переменные. Разница просто в том, что у vetal необходимо хранить накопленную сумму всех отсчетов, поэтому рано или поздно произойдет переполнение. В моем варианте хранится текущее среднее, поэтому переполнения не будет, но требуется лишнее умножение. Вторая переменная для хранения - это количество обработанных отсчетов. Буферов никаких не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 50 29 декабря, 2005 Опубликовано 29 декабря, 2005 · Жалоба dxp Да вариант с коэффициентами из таблицы мне понравился. Количество отсчетов у меня не превышает 64, т.е. можно сперва их принять а уж потом подсчитать среднее. Ну дык вот. Заводим массив со значениями 1/2...1/64, при приеме очередного отсчета добавляем его к сумме предыдущих, далее умножаем на значение из массива (значение какждый раз другое - следующее). Только мне не понятно откуда взялись цифры 14 и 41, Да это к примеру просто привел. по-моему ничто не мешает взять коэффициент 1/64 это не такая уж малая величина. Это значение будет годиться только для вычисления среднего по 64 отсчетам. Для 63 нужен будет коэффициент 1/63, для 62 - 1/62 и т.д. Т.е., как уже сказал выше, массив из таких значений. Он для ADSP-21хх небольшой, все должно получиться. Но все же мне интересно если у меня отсчеты будут идти в количестве несокльких миллионов я же не буду их все складывать в буфер. Может возможно зная текущее среднее обновить его значение приняв следующий отсчет. Не надо никакой буфер. Все принятые отсчеты суммируюся, для них буфер не нужен. Если счет пойдет на миллионы, то делать массив коеффициентов тоже не варинат, придется честно делить. Только тут уж 16-разрядной арифметикой не обойдется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться