FIR = FIR1+FIR2

Все что касается фильтрации
vasilius
Сообщения: 8
Зарегистрирован: 02 сен 2016, 18:56

FIR = FIR1+FIR2

Сообщение vasilius »

Здравствуйте

Интересует возможность пересчета коеф-тов КИХ фильтра так, что б получить два КИХ фильтра меньшей длины, и при "сложении" получить АЧХ изначального фильтра.

Тоесть, например, есть КИХ фильтр на 100 коэф-тов, нужно получить два фильтра по 50 коэф-тов.
Так, что б последовательное (или параллельное со сложением) дало результат по АЧХ, как при изначальном фильтре на 100 коеф-тов. Естественно delay не подходит, так как есть возможность применить всего 50 коэф-тов.

Возможно ли такое преобразование?

Спасибо

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: FIR = FIR1+FIR2

Сообщение Бахурин Сергей »

Можно один FIR заменить двумя короткими включенными последовательно (каскадно). Параллельное включение не пойдет. Для пересчета необходимо произвести деконволюцию (процедуру разложения полинома на множители) и тогда можно разбить фильтр на два каскадно- включенных.

vasilius
Сообщения: 8
Зарегистрирован: 02 сен 2016, 18:56

Re: FIR = FIR1+FIR2

Сообщение vasilius »

Другого, менее ресурсо-затратного способа не существует? Для контроллера это довольно тяжелая процедура. :(

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: FIR = FIR1+FIR2

Сообщение Бахурин Сергей »

Думаю что нет. А зачем вам делить один фильтр на два?

vasilius
Сообщения: 8
Зарегистрирован: 02 сен 2016, 18:56

Re: FIR = FIR1+FIR2

Сообщение vasilius »

Есть импульсный отклик - довольно длинный
есть два ДСП которые могут применить ФИР фильтр на ограниченное количество коэф-тов.
Если усечь импульс до длинны одного ДСП, то второй будет простаивать.
Поэтому есть желание "разбить" импульс так, что б получить более детальную АЧХ, как при более длинном импульсе, но средствами двух ФИР фильтров.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: FIR = FIR1+FIR2

Сообщение Бахурин Сергей »

если ваш импульсный отклик не меняется то вы можете однократно разделить его на два каскадных (используя матлаб например) и применять вашу структуру. Если он меняется то все сложнее вам придется производить его деконволюцию

vasilius
Сообщения: 8
Зарегистрирован: 02 сен 2016, 18:56

Re: FIR = FIR1+FIR2

Сообщение vasilius »

Сам импульсный отклик не меняется, он используется для формирования АЧХ.
Таких "откликов" много - в виде wav файлов. Мне нужно "на лету" уметь их "разделять" на два, как Вы говорите, каскадных. Деконволюция операция тут очевидна, но не реальна в плане реализации.

Если можете, опишите термины основные по теме разделения на "каскадные" импульсы, что б мог почитать об этом, ну или, если возможно, ликбез на эту тему, был бы крайне признателен!

Спасибо

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: FIR = FIR1+FIR2

Сообщение Бахурин Сергей »

код в матлабе (octave) пойдет?

vasilius
Сообщения: 8
Зарегистрирован: 02 сен 2016, 18:56

Re: FIR = FIR1+FIR2

Сообщение vasilius »

Подойдет любой удобный Вам способ!
Матлаб подходит.

Заранее спасибо

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: FIR = FIR1+FIR2

Сообщение Бахурин Сергей »

Вот матлаб код который считает два укороченных фильтра. Я писал его в октаве но должен работать и в матлабе без изменений.
Есть одна тяжелая операция это расчет собственных значений матрицы для получения нулей.

Код: Выделить всё


if(exist('OCTAVE_VERSION', 'builtin') ~= 0)
  pkg load signal;
end

% порядок исходного фильтра 
ord = 16;

% генерю фильтр (можно задать совершенно произвольно)
% ВАЖНО!!! Первый коэффициент фильтра не должен быть равным 0!!!
% h задает передаточную характеристику H(z), которая является полномом
h = fir1(ord, 0.3);

% количество коэффициентов фильтра
l = length(h);

% первый коэффициент является нормировочным ОН НЕ ДОЛЖЕН БЫТЬ НУЛЕВЫМ
norm = h(1);

%Формирую companion matrix для расчета нулей полниома H(z)
A = diag (ones (1, l-2), -1);
A(1,:) = -h(2:l)/norm;

%Нули полинома есть собсвенные числа companion matrix (GOOGLE об этом знает все)
r = eig(A);

% h0 первый укороченный фильтр
h0 = 1;
for(k = 1:length(r)/2);
  h0 = conv(h0, [1, -r(k)]);
end

% h1 первый укороченный фильтр
h1 = 1;
for(k = length(r)/2+1:length(r));
  h1 = conv(h1, [1, -r(k)]);
end

% На графике видно что свертка коротких фильтров дает точно исходный h
% Это значит включенные каскадно они будут работать как исхоный фильтр
% Конечно не забываем вернуть нормировку
figure; plot(0:ord, h, 0:ord, real(conv(h0, h1))*norm) 




Ответить