Maverick_ 10 March 12 Posted March 12 · Report post Всем привет Требуется найти 2 максимума в потоке (стриминг интерфейс), но второй максимум должен отстоять от первого на параметр A (определенное число элементов). Параметр А - диапазон в котором нельзя искать 2 максимум. Во вложении фото чтобы было понятно что требуется реализовать. Также описана реализация с использованием блочной памяти (двойной буферизации), но я думаю что можно реализовать полностью на регистрах - pipeline архитектуре. Интересуют идеи по реализации Quote Share this post Link to post Share on other sites More sharing options...
des00 14 March 12 Posted March 12 · Report post Если диапазон А ограничен, то может быть простая сортировка? PS. В вашем алгоритме последнее сравнение не нужно. Просто маскируете число, например нулём, в случае положительных чисел. Будет ещё один простой проход. Quote Share this post Link to post Share on other sites More sharing options...
Maverick_ 10 March 12 Posted March 12 · Report post 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); просто чем больше элементов сортируем тем длинее это выражение - вставлять элемент или нет комбинационная логика растет... Quote Share this post Link to post Share on other sites More sharing options...
des00 14 March 12 Posted March 12 · Report post 17 minutes ago, Maverick_ said: Сейчас А будет задан в районе 16 (возможно увеличиться). Длина стриминг потока 1024 тогда ресурс будет слишком большой. проще по вашему алгоритму, в два прохода, правда задержка вырастет. Если надо быстрее и диапазон входных чисел не большой, то я бы проверил вариант с гистограммой, но там с темпом поступления данных есть проблемы и не все так просто со сбросом гистограммы. Quote Share this post Link to post Share on other sites More sharing options...
Alex11 2 March 13 Posted March 13 · Report post Что-то я недопонял условие, но, кажется, ту должен быть простой алгоритм однопроходный: ищете локальный максимум, записываете координату и амплитуду, затем продолжаете поиск локального максимума. Если нашли, проверяете расстояние от первого. Если оно Вас устраивает - выдаете найденные, если нет - переписываете координату и амплитуду второго максимума в запомненное и продолжаете поиск. Quote Share this post Link to post Share on other sites More sharing options...
x893 6 March 13 Posted March 13 · Report post 2 minutes ago, Alex11 said: Что-то я недопонял условие, но, кажется, ту должен быть простой алгоритм однопроходный: ищете локальный максимум, записываете координату и амплитуду, затем продолжаете поиск локального максимума. Если нашли, проверяете расстояние от первого. Если оно Вас устраивает - выдаете найденные, если нет - переписываете координату и амплитуду второго максимума в запомненное и продолжаете поиск. Не будет так работать. Quote Share this post Link to post Share on other sites More sharing options...
OparinVD 0 March 15 Posted March 15 · Report post Не то, чтобы совсем не будет... Так можно сделать только для диапазона, который находится ниже по "течению" стрима относительно найденного 1Peak. А в верхнем течении придется проходить повторно. Точнее, может и не придется, но я не придумал, как этого избежать Quote Share this post Link to post Share on other sites More sharing options...
Maverick_ 10 March 15 Posted March 15 · Report post 2 hours ago, OparinVD said: Не то, чтобы совсем не будет... Так можно сделать только для диапазона, который находится ниже по "течению" стрима относительно найденного 1Peak. А в верхнем течении придется проходить повторно. Точнее, может и не придется, но я не придумал, как этого избежать не понял, поясните пожалуйста Quote Share this post Link to post Share on other sites More sharing options...
OparinVD 0 March 16 Posted March 16 · Report post Цепочка такая: 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, а он приезжает только в конце потока. Поэтому надо или развернуть поток хвостом вперед (что вероятно невозможно по природе стримов) или принять весь блок данных и пройти по нему повторно уже "офф-лайн" Quote Share this post Link to post Share on other sites More sharing options...
tegumay 2 March 18 Posted March 18 · Report post по идее должно хватить одного детектора с запретом анализа на А тактов до и после локального максимума и хранить значние предыд. максимума просто. Quote Share this post Link to post Share on other sites More sharing options...
Opex 0 March 27 Posted March 27 · Report post Как найти правый максимум: сравниваем текущий элемент с центральным максимумом, если больше, то обновляем ЦМ, сбрасываем ПМ и запрещаем его обновление на А тактов. Если меньше, обновляем ПМ, если не запрещено. Для поиска левого максимума потребуется сдвиговый регстр / память на А элементов. На вход пишем ЦМ. Если текущий элемент больше ЦМ, то ЛМ заменяем из выхода, без сравнения, он всегда будет не меньше. Quote Share this post Link to post Share on other sites More sharing options...
embddr 0 March 27 Posted March 27 · Report post Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым. Quote Share this post Link to post Share on other sites More sharing options...
Maverick_ 10 March 27 Posted March 27 · Report post 2 hours ago, embddr said: Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым. как насчет расстояния от первого максимума? Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 10 March 27 Posted March 27 · Report post 5 hours ago, embddr said: Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым. И каков же будет алгоритм нахождения A максимумов в потоке? Quote Share this post Link to post Share on other sites More sharing options...
embddr 0 March 30 Posted March 30 · Report post On 3/27/2023 at 7:11 PM, Maverick_ said: как насчет расстояния от первого максимума? В списке будет как минимум один максимум на расстоянии >=A от первого максимума. On 3/27/2023 at 9:41 PM, RobFPGA said: И каков же будет алгоритм нахождения A максимумов в потоке? Например, сортировочная сеть. Quote Share this post Link to post Share on other sites More sharing options...