усреднение 16 битных данных в АЦП
|
|
vsky |
Дата: Пт, 09.01.2009, 19:06 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
50
Замечания:
±
На сайте с 23.09.2008
Статус:
Offline
|
Собственно вопрос, как усреднять 16 битные отсчёты с АЦП средствами PBP? Необходимо просуммировать 5...10 отсчётов и разделить на количество отсчётов, без потери точности. Заранее благодарен за ответы.
|
|
|
|
demanik |
Дата: Пт, 09.01.2009, 19:47 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
О какой точности идет речь ??? АЦП возвращает данные при максимальном разрешении от 0 до 1023. суммируйте 10 замеров у Вас все помещается в переменную WORD потом делите на 10 и в результате среднее. А с ним потом делаем что нужно.
Попробуй всё и вся... может быть пол...
|
|
|
|
vsky |
Дата: Пн, 12.01.2009, 14:36 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
50
Замечания:
±
На сайте с 23.09.2008
Статус:
Offline
|
АЦП-внешний AD7705. Но это не принципиально. Вопрос стоит именно об усреднении 16битных выборок
|
|
|
|
ADMIN |
Дата: Пн, 12.01.2009, 18:01 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Можно так: Code Word1 = (Word1 + Word2)/2 ' Word1 = (Word1 + Word3)/2 ' Word1 = (Word1 + Word4)/2 ' Word1 = (Word1 + Word5)/2 ' Word1 = (Word1 + Word6)/2 ' Word1 = (Word1 + Word7)/2 ' Word1 = (Word1 + Word8)/2 ' Word1 = (Word1 + Word9)/2 ' Word1 = (Word1 + Word10)/2 '
Но можно проще: Code wordIn var word[10] 'массив из десяти переменных типа Word i var byte ' Переменная - счетчик for i = 2 to 10 ' 10 раз складываем результаты wordin[1] = (wordin[1] + wordin[i])/2 ' усреднения в переменную WordIn[1] next i ' В итоге в WordIn[1] усредненное значение десяти измерений
|
|
|
|
holyuser |
Дата: Пн, 12.01.2009, 19:27 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
Предлагаемые выше варианты неприменимы, хотя бы из-за того, что еще при сложении первых двух word's возможно превышение максимально допустимого значения результата, который не может принять значение большее чем word. Найти среднее арифметическое значение нескольких (n<255) переменных типа word, не выходя за рамки возможных значений (65535) в любом случае, можно следующим способом: sum_1 var word 'вспомагательные переменные sum_2 var word average var word 'результат sum_1 = word_1.highbyte + word_2.highbyte + word_3.highbyte + word_n.highbyte sum_2 = word_1.lowbyte + word_2.lowbyte + word_3.lowbyte + word_n.lowbyte average.highbyte = sum_1 / n average.lowbyte = sum_1 // n average = average + sum_2 / n
|
|
|
|
vsky |
Дата: Вт, 13.01.2009, 11:14 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
50
Замечания:
±
На сайте с 23.09.2008
Статус:
Offline
|
holyuser, огромное спасибо. буду пробовать.
|
|
|
|
ADMIN |
Дата: Ср, 14.01.2009, 04:10 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Да, опрометчиво заявил. И на старуху бывает проруха
|
|
|
|
Alex |
Дата: Пт, 23.01.2009, 02:36 | Сообщение # 8 |
Группа:
Удаленные
Ранг:
Сообщений:
Статус:
|
holyuser А не легче ли поделить на 2 каждое значение и сложить ? Выражение Word = (Word1 + Word2)/2 Равносилно выражению Word = Word1 / 2 + Word2 / 2 И не будет никаких переполнений В вашем примере усредняються полубайты и код получаеться слишком грамозким и долговыполнимым. Адолгое выполнение и большая занимаемость области програмной памяти не есть гуд для реализации каких то задач. И это понимет программист тогда, когда начинает писать серьёзные программы, а к этому все придут и начинать правильно минимизировать код и увеличивать скорость выполнение кода нужно с начала, дабы потом не затыкаться на проблемах.
Сообщение отредактировал
Alex - Пт, 23.01.2009, 02:38
|
|
|
|
holyuser |
Дата: Пт, 23.01.2009, 02:51 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
Quote (Alex) holyuser А не легче ли поделить на 2 каждое значение и сложить ? Ну, Вы Alex, даете! Конечно легче было бы: Word = (Word1 + Word2)/2 но к несчастью, еще при сложении Word1 с Word2, может произойти переполнение, а потом что? Добавлено (23.01.2009, 2:51:06) ---------------------------------------------
Quote (Alex) Выражение Word = (Word1 + Word2)/2 Равносилно выражению Word = Word1 / 2 + Word2 / 2 А здесь я в Вами, пожалуй, не соглашусь, Вы о потере точности, случайно, не забыли?
|
|
|
|
Alex |
Дата: Пт, 23.01.2009, 03:34 | Сообщение # 10 |
Группа:
Удаленные
Ранг:
Сообщений:
Статус:
|
Quote может произойти переполнение, а потом что? Да ничего. Для этого придуманы флаги переполнения. Смело складываем два байта, делим пополам, и заменяем старший бит результата на наш флаг.
|
|
|
|
holyuser |
Дата: Пт, 23.01.2009, 03:51 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
Ну а тогда как будут обстоять дела с громоздким и долговыполнимым кодом?
|
|
|
|
Alex |
Дата: Пт, 23.01.2009, 03:59 | Сообщение # 12 |
Группа:
Удаленные
Ранг:
Сообщений:
Статус:
|
А что сдесь громозкого ? Сложил (1 операция), поделил на 2 (1 операция) и заменил бит (2 операции). Использовано 4 переменных и 4 операции. В вашем случае: Выделил 2 младших полубайта (2 операции), поделил на 2 (1), выделил 2 старших полубайта (2 операции), поделил на 2 (1), сложил (1). Использовано 7 переменных и 7 операций. И это ещё не ивестно как он будет выделять полубайты.
Сообщение отредактировал
Alex - Пт, 23.01.2009, 04:09
|
|
|
|
holyuser |
Дата: Пт, 23.01.2009, 04:06 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
Quote (holyuser) А что сдесь громозкого ? А Вы напишите это все на PBP, прокомпилируйте и будет Вам ответ.
|
|
|
|
Alex |
Дата: Пт, 23.01.2009, 04:12 | Сообщение # 14 |
Группа:
Удаленные
Ранг:
Сообщений:
Статус:
|
Ну значит этот компиль не пригоден к использованию Раз вы такого мнения о нём. Ещё и не известно как он будет выделять полубайты. Может сдвигать байт начнёт
|
|
|
|
holyuser |
Дата: Пт, 23.01.2009, 04:18 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
Я о компиляторе PBP ничего плохого не могу сказать, в нем все известно и предсказуемо. А Вы позадумайтесь, как предложенным Вами способом можно найти среднее значение, например, 250 выборок типа word и какая при этом у Вас получится ошибка?
|
|
|
|