128 фильтров

Захват, обработка и генерирование сигнала
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 175 раз
Контактная информация:

128 фильтров

Сообщение Artem.spb »

Система собирает данные со 128 каналов.
Заказчик хочет их фильтровать.
И надо бы сделать по-человечески, с сохранением истории (без перезапуска фильтра перед каждым циклом).
Фильтры сами по себе клонируемые, но вот как сделать 128 копий "автоматом" я не придумал, только руками разделить массив на 128 элементов, каждый элемент (канал) отфильтровать, и собрать всё обратно.
Есть ли более человечный способ? В голове крутится вариант запустить 128 клонов, каждому по собственной очереди выделить. И туда по каналу отправлять, ну и обратно всё собирать. Но тоже так себе вариант, особенно в плане отладки.
Ну и вероятность промахнуться в одном из 128 проводов - элементарно.
filters.PNG
filters.PNG (6.66 КБ) 1534 просмотра
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: 128 фильтров

Сообщение Kosist »

У вас массив кластеров - прогоните его через For Loop, и для For Loop установите For Loop Iteration Parallelism. Если потоков мало будет, то тогда можно несколько таких циклов сделать, и для каждого выделить свой массив данных (например, с 32 каналов).
Мы делили апельсин - много наших полегло...
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 175 раз
Контактная информация:

Re: 128 фильтров

Сообщение Artem.spb »

Kosist писал(а): 05 июн 2022, 09:49 У вас массив кластеров - прогоните его через For Loop, и для For Loop установите For Loop Iteration Parallelism. Если потоков мало будет, то тогда можно несколько таких циклов сделать, и для каждого выделить свой массив данных (например, с 32 каналов).
Проверил, так не работает. Цикл всё же не запоминает, где какой экземпляр вызывался.
P.PNG
Придумал и реализовал промежуточное решение - клонируемый :vi: , в котором 8 параллельных фильтров. А на входе тот самый массив и стартовый индекс.
На тесте такое решение работает, с фильтрами ещё в деле не проверял.
p2.PNG
Вложения
cloneTEst.7z
(33.95 КБ) 33 скачивания
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 175 раз
Контактная информация:

Re: 128 фильтров

Сообщение Artem.spb »

Дополнение. Что-то схема с клонами не работает
filter.PNG
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: 128 фильтров

Сообщение Borjomy_1 »

У каждого фильтра есть свои коэффициенты (статические и динамические) . Поэтому надо залезть внутрь фильтра и переделать его, модифицировав под N каналов, вместо одного. Сделайте копию VI и модифицируйте под свои нужды. Там все открыто. Только учтите, что для разных частотных параметров количество коэффициентов может отличаться. Особенно это касается фильтров с бесконечной импульсной характеристикой.
Аватара пользователя
toshas
assistant
assistant
Сообщения: 105
Зарегистрирован: 05 апр 2009, 22:45
Версия LabVIEW: 9.0
Благодарил (а): 13 раз
Поблагодарили: 7 раз
Контактная информация:

Re: 128 фильтров

Сообщение toshas »

Artem.spb писал(а): 05 июн 2022, 12:44
Kosist писал(а): 05 июн 2022, 09:49 У вас массив кластеров - прогоните его через For Loop, и для For Loop установите For Loop Iteration Parallelism. Если потоков мало будет, то тогда можно несколько таких циклов сделать, и для каждого выделить свой массив данных (например, с 32 каналов).
Проверил, так не работает. Цикл всё же не запоминает, где какой экземпляр вызывался.
По номеру итерации цикла можно отличить какой где экземпляр и разбирать данные соответственно.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 175 раз
Контактная информация:

Re: 128 фильтров

Сообщение Artem.spb »

Borjomy_1 писал(а): 06 июн 2022, 03:01 У каждого фильтра есть свои коэффициенты (статические и динамические) . Поэтому надо залезть внутрь фильтра и переделать его, модифицировав под N каналов, вместо одного. Сделайте копию VI и модифицируйте под свои нужды. Там все открыто. Только учтите, что для разных частотных параметров количество коэффициентов может отличаться. Особенно это касается фильтров с бесконечной импульсной характеристикой.
Спасибо за наводку.
Посмотрел всяких эллиптических чебышевых. Всё сводится к IIR фильтру. А для него есть готовая многоканальная версия, буду её тестировать.
Хотя, не понятно, почему клонирование готовых функция даёт такой результат.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 175 раз
Контактная информация:

Re: 128 фильтров

Сообщение Artem.spb »

toshas писал(а): 06 июн 2022, 12:21 По номеру итерации цикла можно отличить какой где экземпляр и разбирать данные соответственно.
Разбирать что? Проблема не в разборе, а в том что фильтр хранит своё предыдущее состояние, на основе которого считает дальше. И в цикле это уползает.
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: 128 фильтров

Сообщение Juri »

например так
Вложения
cloneTEst.7z
(53.6 КБ) 34 скачивания
Screenshot_1.png
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: 128 фильтров

Сообщение Juri »

хотя Call By Reference надо было вывести за пределы кейса. Причем в цикле в котором исполняется Call By Reference можно тоже включить параллелизм. На результат не повлияет, но тогда вычисления распределятся на все ядра процессора.
Вложения
test3.vi
(21.26 КБ) 32 скачивания
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 175 раз
Контактная информация:

Re: 128 фильтров

Сообщение Artem.spb »

Juri писал(а): 06 июн 2022, 17:47 хотя Call By Reference надо было вывести за пределы кейса. Причем в цикле в котором исполняется Call By Reference можно тоже включить параллелизм. На результат не повлияет, но тогда вычисления распределятся на все ядра процессора.
Не-не, плохой вариант. Вызов по ссылке - очень медленная процедура. По крайней мере по моим тестам несколько лет назад
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5464
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

128 фильтров

Сообщение IvanLis »

"Дело было вечером, делать было нечего..."
Сделал на AF, при необходимости можно модифицировать под свои нужды, масштабировать, уйти от констант и т.д.
Filtered Actor.7z
lv2015
(153.79 КБ) 59 скачиваний
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 392
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: 128 фильтров

Сообщение taras_33 »

Хороший и наглядный пример работы фильтра.
Только 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!
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5464
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

Re: 128 фильтров

Сообщение IvanLis »

taras_33 писал(а): 09 июн 2022, 04:57 Только Stop UsEv не обязательно передавать в nested actor при их запуске, потому как при завершении работы, main посылает stop всем nested actors
Я знаю, что автоматом все закрывается, но привык все контролировать сам. Да и в любом случае Event создавать, а сделав это в "родителе" убиваем всех зайцев.
taras_33 писал(а): 09 июн 2022, 04:57 Только нужно не забывать соединять выход Launch Nested Actor.vi иначе не работает.
Посмотрел, не понимаю....
1. у меня все работает
2. мы ссылку на "родителя" передаем, что бы актор-"потомок" знал кто его запустил, а для этого не обязательно гонять все в цикле.

Тут может быть влияет именно "стиль программирования", но это дело вкуса.
Я зачастую указатель на User Event через сдвиговый регистр гоняю по привычке (хотя на работу никак не влияет), раньше писали, что это позволяет избежать утечек памяти, но я никогда не замечал этого.

Но например с чем недавно столкнулся при использовании акторов, это что после длительной работы (более суток), "сборщик мусора" убивал UserEvent, созданный в методе Pre Launch Init, ссылка на который использовалась внутри Core. Долго искал причину, пока не дошел до того, что перенес создание Event внутрь Core. Я больше практик, но теоретики пояснили, что логику работы "сборщика мусора" толком никто не понимает, а он спустя сутки после закрытия функции (метода) может посчитать, что это "мусор" и подчистить его :haha:
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 392
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: 128 фильтров

Сообщение taras_33 »

Версия первая - рабочая. Запускаем Launcher, открываются четыре окошка. Закрываем main и он автоматом закрывает три nested
Version one.png
Версия вторая - не рабочая. Убираем сдвиговой регистр, остальное в проекте ничего не меняем. Запускаем Launcher, открываются четыре окошка. Закрываем main и
три nested остаются висеть. Собственно я это имел ввиду.
Version two.png
IvanLis писал(а): 09 июн 2022, 23:51 2. мы ссылку на "родителя" передаем, что бы актор-"потомок" знал кто его запустил, а для этого не обязательно гонять все в цикле.
А вот здесь уже я не понял, в Вашем проекте вроде как main и Filtered скорее братья, один из которых старшой :D
Inheritance.PNG
IvanLis писал(а): 09 июн 2022, 23:51 Но например с чем недавно столкнулся при использовании акторов, это что после длительной работы (более суток), "сборщик мусора" убивал UserEvent, созданный в методе Pre Launch Init, ссылка на который использовалась внутри Core. Долго искал причину, пока не дошел до того, что перенес создание Event внутрь Core. Я больше практик, но теоретики пояснили, что логику работы "сборщика мусора" толком никто не понимает, а он спустя сутки после закрытия функции (метода) может посчитать, что это "мусор" и подчистить его :haha:
Интересная информация, не сталкивался нужно будет потестить. Я часто создаю Event-ы в Pre Launch Init а уничтожаю в Stop 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!
Ответить

Вернуться в «Обработка сигнала»