Jump to content
    

найти 2 максимума в потоке

Всем привет

Требуется найти 2 максимума в потоке (стриминг интерфейс), но второй максимум должен отстоять от первого на параметр A (определенное число элементов). Параметр А - диапазон в котором нельзя искать 2 максимум. Во вложении фото чтобы было понятно что требуется реализовать. Также описана реализация с использованием блочной памяти (двойной буферизации), но я думаю что можно реализовать полностью на регистрах - pipeline архитектуре.

Интересуют идеи по реализации

image.thumb.png.891283b7fac4dce04c188201668e5917.png

 

image.thumb.png.08637f0ad859e0c9703f1d75ec2c701d.png

Share this post


Link to post
Share on other sites

Если диапазон А ограничен, то может быть простая сортировка? 

PS. В вашем алгоритме последнее сравнение не нужно. Просто маскируете число, например нулём, в случае положительных чисел. Будет ещё один простой проход. 

Share this post


Link to post
Share on other sites

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

просто чем больше элементов сортируем тем длинее это выражение - вставлять элемент или нет

комбинационная логика растет...

Share this post


Link to post
Share on other sites

17 minutes ago, Maverick_ said:

Сейчас А будет задан в районе 16 (возможно увеличиться). Длина стриминг потока 1024

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

Share this post


Link to post
Share on other sites

Что-то я недопонял условие, но, кажется, ту должен быть простой алгоритм однопроходный: ищете локальный максимум, записываете координату и амплитуду, затем продолжаете поиск локального максимума. Если нашли, проверяете расстояние от первого. Если оно Вас устраивает - выдаете найденные, если нет - переписываете координату и амплитуду второго максимума в запомненное и продолжаете поиск.

Share this post


Link to post
Share on other sites

2 minutes ago, Alex11 said:

Что-то я недопонял условие, но, кажется, ту должен быть простой алгоритм однопроходный: ищете локальный максимум, записываете координату и амплитуду, затем продолжаете поиск локального максимума. Если нашли, проверяете расстояние от первого. Если оно Вас устраивает - выдаете найденные, если нет - переписываете координату и амплитуду второго максимума в запомненное и продолжаете поиск.

Не будет так работать.

Share this post


Link to post
Share on other sites

Не то, чтобы совсем не будет... Так можно сделать только для диапазона, который находится ниже по "течению" стрима относительно найденного 1Peak. А в верхнем течении придется проходить повторно. Точнее, может и не придется, но я не придумал, как этого избежать

Share this post


Link to post
Share on other sites

2 hours ago, OparinVD said:

Не то, чтобы совсем не будет... Так можно сделать только для диапазона, который находится ниже по "течению" стрима относительно найденного 1Peak. А в верхнем течении придется проходить повторно. Точнее, может и не придется, но я не придумал, как этого избежать

не понял, поясните пожалуйста

Share this post


Link to post
Share on other sites

Цепочка такая: 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, а он приезжает только в конце потока. Поэтому надо или развернуть поток хвостом вперед (что вероятно невозможно по природе стримов) или принять весь блок данных и пройти по нему повторно уже "офф-лайн"

Share this post


Link to post
Share on other sites

по идее должно хватить одного детектора с запретом анализа на А тактов до и после локального максимума и хранить значние предыд. максимума просто.

Share this post


Link to post
Share on other sites

Как найти правый максимум: сравниваем текущий элемент с центральным максимумом, если больше, то обновляем ЦМ, сбрасываем ПМ и запрещаем его обновление на А тактов. Если меньше, обновляем ПМ, если не запрещено.

Для поиска левого максимума потребуется сдвиговый регстр / память на А элементов. На вход пишем ЦМ. Если текущий элемент больше ЦМ, то ЛМ заменяем из выхода, без сравнения, он всегда будет не меньше.

Share this post


Link to post
Share on other sites

Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым.

Share this post


Link to post
Share on other sites

2 hours ago, embddr said:

Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым.

как насчет расстояния от первого максимума? 

Share this post


Link to post
Share on other sites

5 hours ago, embddr said:

Найти одновременно A максимумов (с сохранением индексов). Самый большой максимум будет первым, а один из остальных - вторым.

И каков же  будет алгоритм нахождения A максимумов в потоке?    

 

Share this post


Link to post
Share on other sites

On 3/27/2023 at 7:11 PM, Maverick_ said:

как насчет расстояния от первого максимума? 

В списке будет как минимум один максимум на расстоянии >=A от первого максимума.

On 3/27/2023 at 9:41 PM, RobFPGA said:

И каков же  будет алгоритм нахождения A максимумов в потоке?    

 

Например, сортировочная сеть.

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...