Jump to content
    

Осреднение

Всем привет, 

приходят данные одномерный массив на 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 гц

Edited by whale

Share this post


Link to post
Share on other sites

2 hours ago, whale said:

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

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

Share this post


Link to post
Share on other sites

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

Edited by whale

Share this post


Link to post
Share on other sites

18 minutes ago, whale said:

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

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

Share this post


Link to post
Share on other sites

Ставим 

Flag_3x3 = 1

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

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

Edited by whale

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

оказывается тормозит  именно выставление флага 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;}

 

Edited by whale

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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()

  }

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...