Перейти к содержанию
    

Осреднение

Всем привет, 

приходят данные одномерный массив на 1600 байт, его надо налету осреднить самым простым способом 

for(z=2;z!=1600-3;z+=1)
  {
    if(Flag_3x3) data_main[z] = (  data_main[z-1]+                              // осреднение по 3
                                   data_main[z+1]+
                                   data_main[z+0])/3;
 }

при осреднении обработка данных заметно тормозится, 

можно как то ускорить осреднение и вообще непонятно откуда такие тормоза, вроде простые операции.

Массив приходит с частотой 70 гц

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, whale said:

можно как то ускорить осреднение и вообще непонятно откуда такие тормоза, вроде простые операции.

Нам бы конкретики поболее) Цифры, архитектура, многозадачность/однозадачность и т.п. А уж за листинг вообще отблагодарим (вдруг у вас оптимизация выключена или ещё что=нить).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это windows 7 на большом брате без оптимизации билдер 6, оптимизация не помогает, совсем, поток один.

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, whale said:

Это windows 7 на большом брате без оптимизации билдер 6, оптимизация не помогает, совсем, поток один.

Я пас. Только минутно удивлюсь, как на такой платформе могут быть тормоза с простейшей операцией? Может быть что-то другое тормозит ваш поток? Операции-то элементарные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ставим 

Flag_3x3 = 1

тормозит, =0 не тормозит, может слишком много данных. 

Может в options билдере что нить подправить ?

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стоп, а типа данных-то какой? Я ведь машинально подумал на что-то типа float/int. а то у вас там может быть целый класс осредняется, а операторы арихметики перегружены)

Блин, сразу не увидел. Что байты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что значит тормозит? Это в цифрах как? Не могу поверить, что проц в ПК не справляется с этим? Может быть переключение задач в винде смахивает на тормоза?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, whale сказал:

можно как то ускорить осреднение и вообще непонятно откуда такие тормоза, вроде простые операции.

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

2. Заменить деление умножением.

3. За одну итерацию выполнять вычисление не одной суммы, а нескольких подряд (будут меньше пустые траты на обработку цикла (переходы инкременты и т.п.)).

4. Если о входных данных известно, что они гарантированно не перекрывают весь диапазон возможных значений данного типа (например могут быть только в диапазоне: 0...63), то можно делать суммирование по N байт сразу. Например - 64-битными словами (а можно и больше - всякие MMX-расширения поддерживают вроде и 256-битные данные), а потом разделять на отдельные суммы).

 

8 часов назад, whale сказал:

Массив приходит с частотой 70 гц

Массив размером всего 1600 байт приходящий с частотой 70Гц вызывает тормоза на современном ПК??? :wacko2:  А по сколько шт. данных суммируете? Реально по 3 или больше? Если первое - то не может тормозить такое на современном ПК, проблема в чём-то другом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо, иногда  просто прилюдно задать вопрос уже заставляем мозг быстрее думать, 

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

удивительное рядом...

Вот так не тормозит совсем.

Видно по таймеру да и на глаз заметно вывод данных.

 

ps всех обманул, оказывается этот флаг еще тут запускает подпрограмку которая всех тормозила ) чудес не случилось

 if(Form6->CheckBox15->Checked) // if(Flag_3x3)               
                        {data_main[z] = (
                                        data_main[z-1]+
                                        data_main[z+1]+
                                        data_main[z+0])/3;}

 

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, если вы так пытаетесь заменить значения средними (из 3х), то у вас ошибка. Усреднение элемента исказит значения следующего (вы переписываете текущее значение, и при вычислении следующего оно уже другое)

Сделайте скользящую сумму, как Jcxz предложил

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Усреднение или сглаживание может зависеть от типа данных, нужно ввести проверку на случайные значения и максимум процент изменения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/11/2021 at 1:24 AM, whale said:
for(z=2;z!=1600-3;z+=1)
  {
    if(Flag_3x3) data_main[z] = (  data_main[z-1]+                              // осреднение по 3
                                   data_main[z+1]+
                                   data_main[z+0])/3;
 }

Зачем вы на каждой итерации проверяете флаг? Быстрее будет 

if(Flag_3x3)

  {for()

  }

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...