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 9 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 9 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 4 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 Thursday at 07:59 AM Posted Thursday at 07:59 AM · 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 0 Saturday at 05:34 PM Posted Saturday at 05:34 PM · Report post по идее должно хватить одного детектора с запретом анализа на А тактов до и после локального максимума и хранить значние предыд. максимума просто. Quote Share this post Link to post Share on other sites More sharing options...