Использование фильтров в цикле For loop

Захват, обработка и генерирование сигнала
Ответить
Alex Dem
assistant
assistant
Сообщения: 119
Зарегистрирован: 06 май 2015, 22:24
Версия LabVIEW: 2014, 2018
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Использование фильтров в цикле For loop

Сообщение Alex Dem »

Добрый день! Прошу помощи в решении следующей задачи.
С генератора шума сигнал попадает на 2 полосовых фильтра, затем выходные сигналы суммируются и результат выводится на график. Здесь все понятно. Как (и можно ли) добиться такого же результата, расположив полосовой фильтр внутри цикла For loop? В дальнейшем требуется количество фильтров и их параметры задавать пользователю в файле , вот почему интересует решение данной задачи. Спасибо.
Вложения
For loop filters.png
Аватара пользователя
Kosist

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

Re: Использование фильтров в цикле For loop

Сообщение Kosist »

Можно - цикл For Loop будет индексироваться количеством нужных фильтров, которые будут обрабатывать входящий сигнал, а на выходе цикла собирать двумерный массив (или если сигнал будет последовательно фильтроваться, то на выходе будет одномерный массив как сейчас у Вас; и внутри цикла массив/сигнал будет передаваться между итерациями For Loop в сдвиговом регистре).
Мы делили апельсин - много наших полегло...
Alex Dem
assistant
assistant
Сообщения: 119
Зарегистрирован: 06 май 2015, 22:24
Версия LabVIEW: 2014, 2018
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Использование фильтров в цикле For loop

Сообщение Alex Dem »

Спасибо за ответ. Но проблема в том, что при работе фильтров внутри цикла For loop форма сигналов на выходе не такая, как при простом включении фильтров, что видно на графиках.
Как сделать так, чтобы результаты работы обоих вариантов совпадали?
Аватара пользователя
Kosist

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

Re: Использование фильтров в цикле For loop

Сообщение Kosist »

Alex Dem писал(а):Спасибо за ответ. Но проблема в том, что при работе фильтров внутри цикла For loop форма сигналов на выходе не такая, как при простом включении фильтров, что видно на графиках.
Как сделать так, чтобы результаты работы обоих вариантов совпадали?
Это потому что фильтр имеет вход (init/cont (init:F) = True), т.е. он "пред-заполнен", содержит значения с предыдущего исполнения. Поставьте везде значение входа на False, и графики будут одинаковые (чтобы проверить это, двумерный массив на выходе цикла Фор Луп разложите на два одномерных, и сложите их - получите то же, что и на Вашем третьем графике).
Мы делили апельсин - много наших полегло...
Borjomy_1

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

Re: Использование фильтров в цикле For loop

Сообщение Borjomy_1 »

Вообще-то каждый экземпляр фильтра "реентрантный", т.е имеет свое состояние. Таким образом он способен обрабатывать без переинициализации только одну полосу частот даже при работе в цикле. Это относится и к фильтрам, заложенным в обычную SubVI. Поэтому если вы вызываете такую SubVI из разных мест, готовьтесь к неправильной работе.
Для того, чтобы один фильтр мог выполнять фильтрацию по нескольким полосам, для каждой полосы необходимо иметь свой набор коэффициентов и состояний.

Вот вам вариант многополосного фильтра, сделанный на основе обычного баттерворда. Я брал и копировал содержимое Butterworth Filter.vi и его SubVI, добавив хранение коэффициентов фильтров и его состояний.
Вложения
мультиполосный баттерворд.png
Мультиполосный баттерворд (SubVI).vi
(26.08 КБ) 193 скачивания
Alex Dem
assistant
assistant
Сообщения: 119
Зарегистрирован: 06 май 2015, 22:24
Версия LabVIEW: 2014, 2018
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Использование фильтров в цикле For loop

Сообщение Alex Dem »

Kosist, поставил везде False, результаты совпали.
Borjomy_1, я правильно понял, что если использовать Ваш пример, тогда
не будет начальной задержки в работе фильтров, как при init/cont = False, так как информация для фильтров в кластерах будет передаваться между итерациями?
Спасибо, за Вашу помощь.
Borjomy_1

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

Re: Использование фильтров в цикле For loop

Сообщение Borjomy_1 »

Задержка будет, но только на первой итерации цикла, обязательно надо ставить на инит фильтра условие "не равно 0" от индекса цикла. Тогда фильтр будет правильно проинициализирован при первом проходе. В вашей реализации фильтр в принципе работать не будет, поскольку максимум, на что он способен - это автоматически проинициализироваться при первом запуске (при значении init=true). Та часть, что у вас в цикле For Loop, проинициализируется только на первый диапазон. Поэтому, для получения адекватных результатов всегда явно инициализируйте фильтр, либо другую функцию со входом Init.
Обратите внимание еще на то, что фильтры инициализируются при False, в отличие от большинства других функций. Но у них в имени входа явно прописано условие: init:false. А вот Point To Point версии фильтров инициализируются как большинство, по true. Явная инициализация не требует особых затрат, однако это предупреждает всякие неприятные неожиданности.
Также рекомендую в случае HighPass или LowPass фильтров подавать значение граничной полосы на оба входа (High и Low). В таком случае ошибка подачи этого значения на незадействованный вход и использование значения 0.46 по умолчанию для задействованного исключается, это, кстати, всех касается :wink:
Alex Dem
assistant
assistant
Сообщения: 119
Зарегистрирован: 06 май 2015, 22:24
Версия LabVIEW: 2014, 2018
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Использование фильтров в цикле For loop

Сообщение Alex Dem »

Borjomy_1, на основе Вашего SubVI все работает как надо, спасибо.
Не могли бы Вы объяснить, зачем у Вас использован Type Cast? Я раньше никогда этим элементом не пользовался,
но на входе и на выходе из него одинаковые массивы, в чем смысл его применения?
Вложения
for2.png
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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