Страница 1 из 1

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

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

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

Добавлено: 27 апр 2017, 00:50
Kosist
Можно - цикл For Loop будет индексироваться количеством нужных фильтров, которые будут обрабатывать входящий сигнал, а на выходе цикла собирать двумерный массив (или если сигнал будет последовательно фильтроваться, то на выходе будет одномерный массив как сейчас у Вас; и внутри цикла массив/сигнал будет передаваться между итерациями For Loop в сдвиговом регистре).

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

Добавлено: 27 апр 2017, 06:45
Alex Dem
Спасибо за ответ. Но проблема в том, что при работе фильтров внутри цикла For loop форма сигналов на выходе не такая, как при простом включении фильтров, что видно на графиках.
Как сделать так, чтобы результаты работы обоих вариантов совпадали?

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

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

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

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

Вот вам вариант многополосного фильтра, сделанный на основе обычного баттерворда. Я брал и копировал содержимое Butterworth Filter.vi и его SubVI, добавив хранение коэффициентов фильтров и его состояний.

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

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

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

Добавлено: 27 апр 2017, 22:21
Borjomy_1
Задержка будет, но только на первой итерации цикла, обязательно надо ставить на инит фильтра условие "не равно 0" от индекса цикла. Тогда фильтр будет правильно проинициализирован при первом проходе. В вашей реализации фильтр в принципе работать не будет, поскольку максимум, на что он способен - это автоматически проинициализироваться при первом запуске (при значении init=true). Та часть, что у вас в цикле For Loop, проинициализируется только на первый диапазон. Поэтому, для получения адекватных результатов всегда явно инициализируйте фильтр, либо другую функцию со входом Init.
Обратите внимание еще на то, что фильтры инициализируются при False, в отличие от большинства других функций. Но у них в имени входа явно прописано условие: init:false. А вот Point To Point версии фильтров инициализируются как большинство, по true. Явная инициализация не требует особых затрат, однако это предупреждает всякие неприятные неожиданности.
Также рекомендую в случае HighPass или LowPass фильтров подавать значение граничной полосы на оба входа (High и Low). В таком случае ошибка подачи этого значения на незадействованный вход и использование значения 0.46 по умолчанию для задействованного исключается, это, кстати, всех касается :wink:

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

Добавлено: 29 апр 2017, 07:44
Alex Dem
Borjomy_1, на основе Вашего SubVI все работает как надо, спасибо.
Не могли бы Вы объяснить, зачем у Вас использован Type Cast? Я раньше никогда этим элементом не пользовался,
но на входе и на выходе из него одинаковые массивы, в чем смысл его применения?