Есть такая задача. На вход программы (с драйвера) поступает пакет данных: 10600 каналов по 2048 значений (подряд во времени) в каждом канале. Пакет поступает каждые 200мс. То есть частота получаемых данных: 10140 раз в секунду (приблизительно 10 кГц). Нужно отфильровать информацию по каждому каналу полосовым фильтром (вернее даже шестью полосовыми фильтрами, шесть полос). Самая нижняя полоса пропускания – от 0 до 50 Гц.
Логичное решение – загонять все данные в очередь и в параллельном цикле каждый пакет данных разбивать на каналы, каждый канал – массив 2048 значений и этот массив загонять в фильтр Баттерворта. Но если мы вызываем каждые 200 мс фильтр, то на частотах от 0 до 50 Гц мы каждые 200 мс на выходе будем наблюдать переходный процесс в самом начале (на остальных частотах так же, просто не так заметно).
Как этого избежать? В фильтре есть специальный вход:
Он работает, всё замечательно на одном канале, переходный процесс есть только в начале, а потом процесс фильтрации установившийся. Конкретно фильтр работает в subVI. Но когда мы увеличиваем количество каналов до двух, то разумеется, нам нужно 2 различных экземпляра этого subVI (можно его так же назвать FGV, но кажется это не совсем корректно).init/cont controls the initialization of the internal states. The default is FALSE. The first time this VI runs or if init/cont is FALSE, LabVIEW initializes the internal states to 0. If init/cont is TRUE, LabVIEW initializes the internal states to the final states from the previous call to this instance of this VI. To process a large data sequence that consists of smaller blocks, set this input to FALSE for the first block and to TRUE for continuous filtering of all remaining blocks.
Хорошо, идем дальше. Как сделать 10600 различных экземпляров subVI и обратиться к ним в внешнем цикле (к примеру, они будут иметь разное имя файла)? Вот здесь пример кода без различных экземпляров subVI. Я пока придумал сделать 10600 subVI в папке и вызывать их асинхронным вызовом. И я понимаю, что с этого момента я делаю что-то не то… Проблема появилась сразу же. Вот этот код выполняется очень долго, около 4 минут. Может быть можно как-нибудь вызывать в цикле разные экземпляры subVI? Я понимаю, что возможно работа с 10600 FGV это плохой вариант – обращение к памяти, хранение 10600 экземпляров и прочее.
В принципе, есть очень тупой вариант вообще не использовать различные экземпляры subVI, а загонять каждый раз в фильтр пакет значений, которые нужно отфильтровать, а перед ним – небольшой набор предыдущих данных, чтобы фильтр по предыдущим данных прошел переходный процесс и «устаканился», фильтруя нужный пакет данных.
Что посоветуете? Заранее спасибо за ответы.