Maverick_ 15 12 марта, 2023 Опубликовано 12 марта, 2023 · Жалоба Всем привет Требуется найти 2 максимума в потоке (стриминг интерфейс), но второй максимум должен отстоять от первого на параметр A (определенное число элементов). Параметр А - диапазон в котором нельзя искать 2 максимум. Во вложении фото чтобы было понятно что требуется реализовать. Также описана реализация с использованием блочной памяти (двойной буферизации), но я думаю что можно реализовать полностью на регистрах - pipeline архитектуре. Интересуют идеи по реализации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 марта, 2023 Опубликовано 12 марта, 2023 · Жалоба Если диапазон А ограничен, то может быть простая сортировка? PS. В вашем алгоритме последнее сравнение не нужно. Просто маскируете число, например нулём, в случае положительных чисел. Будет ещё один простой проход. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 12 марта, 2023 Опубликовано 12 марта, 2023 · Жалоба 35 minutes ago, des00 said: Если диапазон А ограничен, то может быть простая сортировка? Сейчас А будет задан в районе 16 (возможно увеличиться). Длина стриминг потока 1024 Идею с сортировкой понял, но может есть более простое решение PS Для сортровки можно использовать, только сделать для А=16 на 17 элементов и брать за второй максимум 17 значение сортировки, первый элемент сортировки будет первый - первый максимум. там "плохое место" reg_insert <= ('0' and reg_cout0) or (reg_cout0 and reg_cout1) or (reg_cout1 and reg_cout2) or (reg_cout2 and reg_cout3); просто чем больше элементов сортируем тем длинее это выражение - вставлять элемент или нет комбинационная логика растет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 марта, 2023 Опубликовано 12 марта, 2023 · Жалоба 17 minutes ago, Maverick_ said: Сейчас А будет задан в районе 16 (возможно увеличиться). Длина стриминг потока 1024 тогда ресурс будет слишком большой. проще по вашему алгоритму, в два прохода, правда задержка вырастет. Если надо быстрее и диапазон входных чисел не большой, то я бы проверил вариант с гистограммой, но там с темпом поступления данных есть проблемы и не все так просто со сбросом гистограммы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 5 13 марта, 2023 Опубликовано 13 марта, 2023 · Жалоба Что-то я недопонял условие, но, кажется, ту должен быть простой алгоритм однопроходный: ищете локальный максимум, записываете координату и амплитуду, затем продолжаете поиск локального максимума. Если нашли, проверяете расстояние от первого. Если оно Вас устраивает - выдаете найденные, если нет - переписываете координату и амплитуду второго максимума в запомненное и продолжаете поиск. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 13 марта, 2023 Опубликовано 13 марта, 2023 · Жалоба 2 minutes ago, Alex11 said: Что-то я недопонял условие, но, кажется, ту должен быть простой алгоритм однопроходный: ищете локальный максимум, записываете координату и амплитуду, затем продолжаете поиск локального максимума. Если нашли, проверяете расстояние от первого. Если оно Вас устраивает - выдаете найденные, если нет - переписываете координату и амплитуду второго максимума в запомненное и продолжаете поиск. Не будет так работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OparinVD 0 15 марта, 2023 Опубликовано 15 марта, 2023 · Жалоба Не то, чтобы совсем не будет... Так можно сделать только для диапазона, который находится ниже по "течению" стрима относительно найденного 1Peak. А в верхнем течении придется проходить повторно. Точнее, может и не придется, но я не придумал, как этого избежать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 15 марта, 2023 Опубликовано 15 марта, 2023 · Жалоба 2 hours ago, OparinVD said: Не то, чтобы совсем не будет... Так можно сделать только для диапазона, который находится ниже по "течению" стрима относительно найденного 1Peak. А в верхнем течении придется проходить повторно. Точнее, может и не придется, но я не придумал, как этого избежать не понял, поясните пожалуйста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OparinVD 0 16 марта, 2023 Опубликовано 16 марта, 2023 · Жалоба Цепочка такая: input --> 1Peak detector --> 2Peak_d detector 2Peak_d detector - это тот, который ищет максимум в "нижнем течении". Он не просто ищет максимум, а строит функцию F=max(range_width) и заносит результат в таблицу - некий макро-LUT. Например, если данные едут нулевым номером вперед, то в позиции F(1) будет храниться максимальное значение среди [d_0000], на F(5) будет храниться максимальное значение среди [d_0004..d_0000] (точнее, хранится пара координата:значение). Тогда детектор главного пика 1Peak пробегает весь поток, находит координату максимума 1Peak_pos и по таблице смотрит значение F(1Peak_pos - a) Вот в зеркальную от 1Peak сторону такой фокус не пройдет, там по аналогии надо строить функцию для диапазонов [d_1023], [d_1023:d_1022] и т.д. то есть везде присутствует d_1023, а он приезжает только в конце потока. Поэтому надо или развернуть поток хвостом вперед (что вероятно невозможно по природе стримов) или принять весь блок данных и пройти по нему повторно уже "офф-лайн" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tegumay 4 18 марта, 2023 Опубликовано 18 марта, 2023 · Жалоба по идее должно хватить одного детектора с запретом анализа на А тактов до и после локального максимума и хранить значние предыд. максимума просто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Opex 0 27 марта, 2023 Опубликовано 27 марта, 2023 · Жалоба Как найти правый максимум: сравниваем текущий элемент с центральным максимумом, если больше, то обновляем ЦМ, сбрасываем ПМ и запрещаем его обновление на А тактов. Если меньше, обновляем ПМ, если не запрещено. Для поиска левого максимума потребуется сдвиговый регстр / память на А элементов. На вход пишем ЦМ. Если текущий элемент больше ЦМ, то ЛМ заменяем из выхода, без сравнения, он всегда будет не меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
embddr 0 27 марта, 2023 Опубликовано 27 марта, 2023 · Жалоба Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 27 марта, 2023 Опубликовано 27 марта, 2023 · Жалоба 2 hours ago, embddr said: Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым. как насчет расстояния от первого максимума? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 27 марта, 2023 Опубликовано 27 марта, 2023 · Жалоба 5 hours ago, embddr said: Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым. И каков же будет алгоритм нахождения A максимумов в потоке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
embddr 0 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба On 3/27/2023 at 7:11 PM, Maverick_ said: как насчет расстояния от первого максимума? В списке будет как минимум один максимум на расстоянии >=A от первого максимума. On 3/27/2023 at 9:41 PM, RobFPGA said: И каков же будет алгоритм нахождения A максимумов в потоке? Например, сортировочная сеть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться