whale 3 June 10, 2021 Posted June 10, 2021 (edited) · Report post Всем привет, приходят данные одномерный массив на 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 June 10, 2021 by whale Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 63 June 11, 2021 Posted June 11, 2021 · Report post 2 hours ago, whale said: можно как то ускорить осреднение и вообще непонятно откуда такие тормоза, вроде простые операции. Нам бы конкретики поболее) Цифры, архитектура, многозадачность/однозадачность и т.п. А уж за листинг вообще отблагодарим (вдруг у вас оптимизация выключена или ещё что=нить). Quote Share this post Link to post Share on other sites More sharing options...
whale 3 June 11, 2021 Posted June 11, 2021 (edited) · Report post Это windows 7 на большом брате без оптимизации билдер 6, оптимизация не помогает, совсем, поток один. Edited June 11, 2021 by whale Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 63 June 11, 2021 Posted June 11, 2021 · Report post 18 minutes ago, whale said: Это windows 7 на большом брате без оптимизации билдер 6, оптимизация не помогает, совсем, поток один. Я пас. Только минутно удивлюсь, как на такой платформе могут быть тормоза с простейшей операцией? Может быть что-то другое тормозит ваш поток? Операции-то элементарные. Quote Share this post Link to post Share on other sites More sharing options...
whale 3 June 11, 2021 Posted June 11, 2021 (edited) · Report post Ставим Flag_3x3 = 1 тормозит, =0 не тормозит, может слишком много данных. Может в options билдере что нить подправить ? Edited June 11, 2021 by whale Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 63 June 11, 2021 Posted June 11, 2021 · Report post Стоп, а типа данных-то какой? Я ведь машинально подумал на что-то типа float/int. а то у вас там может быть целый класс осредняется, а операторы арихметики перегружены) Блин, сразу не увидел. Что байты. Quote Share this post Link to post Share on other sites More sharing options...
whale 3 June 11, 2021 Posted June 11, 2021 · Report post unsigned short data_main[num_main]={0}; Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 63 June 11, 2021 Posted June 11, 2021 · Report post А что значит тормозит? Это в цифрах как? Не могу поверить, что проц в ПК не справляется с этим? Может быть переключение задач в винде смахивает на тормоза? Quote Share this post Link to post Share on other sites More sharing options...
jcxz 309 June 11, 2021 Posted June 11, 2021 · Report post 8 часов назад, whale сказал: можно как то ускорить осреднение и вообще непонятно откуда такие тормоза, вроде простые операции. 1. Зачем многократно суммировать одни и те же значения? Надо просто вести скользящую сумму, и для вычисления каждой новой суммы одно значение (старое) вычитать из скользящей суммы и одно - прибавлять к ней (новое). Тогда будет только два суммирования/вычитания на итерацию. 2. Заменить деление умножением. 3. За одну итерацию выполнять вычисление не одной суммы, а нескольких подряд (будут меньше пустые траты на обработку цикла (переходы инкременты и т.п.)). 4. Если о входных данных известно, что они гарантированно не перекрывают весь диапазон возможных значений данного типа (например могут быть только в диапазоне: 0...63), то можно делать суммирование по N байт сразу. Например - 64-битными словами (а можно и больше - всякие MMX-расширения поддерживают вроде и 256-битные данные), а потом разделять на отдельные суммы). 8 часов назад, whale сказал: Массив приходит с частотой 70 гц Массив размером всего 1600 байт приходящий с частотой 70Гц вызывает тормоза на современном ПК??? А по сколько шт. данных суммируете? Реально по 3 или больше? Если первое - то не может тормозить такое на современном ПК, проблема в чём-то другом. Quote Share this post Link to post Share on other sites More sharing options...
whale 3 June 11, 2021 Posted June 11, 2021 (edited) · Report post Всем спасибо, иногда просто прилюдно задать вопрос уже заставляем мозг быстрее думать, оказывается тормозит именно выставление флага 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 June 11, 2021 by whale Quote Share this post Link to post Share on other sites More sharing options...
xvr 12 July 12, 2021 Posted July 12, 2021 · Report post Кстати, если вы так пытаетесь заменить значения средними (из 3х), то у вас ошибка. Усреднение элемента исказит значения следующего (вы переписываете текущее значение, и при вычислении следующего оно уже другое) Сделайте скользящую сумму, как Jcxz предложил Quote Share this post Link to post Share on other sites More sharing options...
rmDAC 4 June 6, 2023 Posted June 6, 2023 · Report post Усреднение или сглаживание может зависеть от типа данных, нужно ввести проверку на случайные значения и максимум процент изменения. Quote Share this post Link to post Share on other sites More sharing options...
Dvorkin 1 March 14, 2024 Posted March 14, 2024 · Report post 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() } 1 Quote Share this post Link to post Share on other sites More sharing options...