128 фильтров
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
128 фильтров
Система собирает данные со 128 каналов.
Заказчик хочет их фильтровать.
И надо бы сделать по-человечески, с сохранением истории (без перезапуска фильтра перед каждым циклом).
Фильтры сами по себе клонируемые, но вот как сделать 128 копий "автоматом" я не придумал, только руками разделить массив на 128 элементов, каждый элемент (канал) отфильтровать, и собрать всё обратно.
Есть ли более человечный способ? В голове крутится вариант запустить 128 клонов, каждому по собственной очереди выделить. И туда по каналу отправлять, ну и обратно всё собирать. Но тоже так себе вариант, особенно в плане отладки.
Ну и вероятность промахнуться в одном из 128 проводов - элементарно.
Заказчик хочет их фильтровать.
И надо бы сделать по-человечески, с сохранением истории (без перезапуска фильтра перед каждым циклом).
Фильтры сами по себе клонируемые, но вот как сделать 128 копий "автоматом" я не придумал, только руками разделить массив на 128 элементов, каждый элемент (канал) отфильтровать, и собрать всё обратно.
Есть ли более человечный способ? В голове крутится вариант запустить 128 клонов, каждому по собственной очереди выделить. И туда по каналу отправлять, ну и обратно всё собирать. Но тоже так себе вариант, особенно в плане отладки.
Ну и вероятность промахнуться в одном из 128 проводов - элементарно.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: 128 фильтров
У вас массив кластеров - прогоните его через For Loop, и для For Loop установите For Loop Iteration Parallelism. Если потоков мало будет, то тогда можно несколько таких циклов сделать, и для каждого выделить свой массив данных (например, с 32 каналов).
Мы делили апельсин - много наших полегло...
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: 128 фильтров
Проверил, так не работает. Цикл всё же не запоминает, где какой экземпляр вызывался. Придумал и реализовал промежуточное решение - клонируемый , в котором 8 параллельных фильтров. А на входе тот самый массив и стартовый индекс.
На тесте такое решение работает, с фильтрами ещё в деле не проверял.
- Вложения
-
- cloneTEst.7z
- (33.95 КБ) 33 скачивания
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: 128 фильтров
У каждого фильтра есть свои коэффициенты (статические и динамические) . Поэтому надо залезть внутрь фильтра и переделать его, модифицировав под N каналов, вместо одного. Сделайте копию VI и модифицируйте под свои нужды. Там все открыто. Только учтите, что для разных частотных параметров количество коэффициентов может отличаться. Особенно это касается фильтров с бесконечной импульсной характеристикой.
- toshas
- assistant
- Сообщения: 105
- Зарегистрирован: 05 апр 2009, 22:45
- Версия LabVIEW: 9.0
- Благодарил (а): 13 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: 128 фильтров
По номеру итерации цикла можно отличить какой где экземпляр и разбирать данные соответственно.
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: 128 фильтров
Спасибо за наводку.Borjomy_1 писал(а): ↑06 июн 2022, 03:01 У каждого фильтра есть свои коэффициенты (статические и динамические) . Поэтому надо залезть внутрь фильтра и переделать его, модифицировав под N каналов, вместо одного. Сделайте копию VI и модифицируйте под свои нужды. Там все открыто. Только учтите, что для разных частотных параметров количество коэффициентов может отличаться. Особенно это касается фильтров с бесконечной импульсной характеристикой.
Посмотрел всяких эллиптических чебышевых. Всё сводится к IIR фильтру. А для него есть готовая многоканальная версия, буду её тестировать.
Хотя, не понятно, почему клонирование готовых функция даёт такой результат.
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: 128 фильтров
Разбирать что? Проблема не в разборе, а в том что фильтр хранит своё предыдущее состояние, на основе которого считает дальше. И в цикле это уползает.
- Juri
- I/O
- Сообщения: 263
- Зарегистрирован: 19 апр 2017, 23:06
- Версия LabVIEW: 2021
- Благодарил (а): 13 раз
- Поблагодарили: 6 раз
Re: 128 фильтров
хотя Call By Reference надо было вывести за пределы кейса. Причем в цикле в котором исполняется Call By Reference можно тоже включить параллелизм. На результат не повлияет, но тогда вычисления распределятся на все ядра процессора.
- Вложения
-
- test3.vi
- (21.26 КБ) 32 скачивания
-
- professor
- Сообщения: 3406
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: 128 фильтров
Не-не, плохой вариант. Вызов по ссылке - очень медленная процедура. По крайней мере по моим тестам несколько лет назад
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
128 фильтров
"Дело было вечером, делать было нечего..."
Сделал на AF, при необходимости можно модифицировать под свои нужды, масштабировать, уйти от констант и т.д.
Сделал на AF, при необходимости можно модифицировать под свои нужды, масштабировать, уйти от констант и т.д.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
taras_33
- professional
- Сообщения: 392
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: 128 фильтров
Хороший и наглядный пример работы фильтра.
Только Stop UsEv не обязательно передавать в nested actor при их запуске, потому как при завершении работы, main посылает stop всем nested actors, которые запустил, а сгенерировать Stop Event и остановить While loop можно уже в Stop Core.vi .
Только нужно не забывать соединять выход Launch Nested Actor.vi иначе не работает. Посмотрите отличие Launch Filtered.vi от Вашего.
Только Stop UsEv не обязательно передавать в nested actor при их запуске, потому как при завершении работы, main посылает stop всем nested actors, которые запустил, а сгенерировать Stop Event и остановить While loop можно уже в Stop Core.vi .
Только нужно не забывать соединять выход Launch Nested Actor.vi иначе не работает. Посмотрите отличие Launch Filtered.vi от Вашего.
- Вложения
-
- Filtered Actor.zip
- (212.34 КБ) 41 скачивание
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
So far, the Universe is winning!
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: 128 фильтров
Я знаю, что автоматом все закрывается, но привык все контролировать сам. Да и в любом случае Event создавать, а сделав это в "родителе" убиваем всех зайцев.
Посмотрел, не понимаю....
1. у меня все работает
2. мы ссылку на "родителя" передаем, что бы актор-"потомок" знал кто его запустил, а для этого не обязательно гонять все в цикле.
Тут может быть влияет именно "стиль программирования", но это дело вкуса.
Я зачастую указатель на User Event через сдвиговый регистр гоняю по привычке (хотя на работу никак не влияет), раньше писали, что это позволяет избежать утечек памяти, но я никогда не замечал этого.
Но например с чем недавно столкнулся при использовании акторов, это что после длительной работы (более суток), "сборщик мусора" убивал UserEvent, созданный в методе Pre Launch Init, ссылка на который использовалась внутри Core. Долго искал причину, пока не дошел до того, что перенес создание Event внутрь Core. Я больше практик, но теоретики пояснили, что логику работы "сборщика мусора" толком никто не понимает, а он спустя сутки после закрытия функции (метода) может посчитать, что это "мусор" и подчистить его
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
taras_33
- professional
- Сообщения: 392
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: 128 фильтров
Версия первая - рабочая. Запускаем Launcher, открываются четыре окошка. Закрываем main и он автоматом закрывает три nested
три nested остаются висеть. Собственно я это имел ввиду.
Версия вторая - не рабочая. Убираем сдвиговой регистр, остальное в проекте ничего не меняем. Запускаем Launcher, открываются четыре окошка. Закрываем main и три nested остаются висеть. Собственно я это имел ввиду.
А вот здесь уже я не понял, в Вашем проекте вроде как main и Filtered скорее братья, один из которых старшой
Интересная информация, не сталкивался нужно будет потестить. Я часто создаю Event-ы в Pre Launch Init а уничтожаю в Stop Core.IvanLis писал(а): ↑09 июн 2022, 23:51 Но например с чем недавно столкнулся при использовании акторов, это что после длительной работы (более суток), "сборщик мусора" убивал UserEvent, созданный в методе Pre Launch Init, ссылка на который использовалась внутри Core. Долго искал причину, пока не дошел до того, что перенес создание Event внутрь Core. Я больше практик, но теоретики пояснили, что логику работы "сборщика мусора" толком никто не понимает, а он спустя сутки после закрытия функции (метода) может посчитать, что это "мусор" и подчистить его
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
So far, the Universe is winning!