Перейти к содержанию
    

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

Всем привет

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

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

image.thumb.png.891283b7fac4dce04c188201668e5917.png

 

image.thumb.png.08637f0ad859e0c9703f1d75ec2c701d.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, Maverick_ said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Alex11 said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, OparinVD said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, embddr said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, embddr said:

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...