FIR = FIR1+FIR2
FIR = FIR1+FIR2
Здравствуйте
Интересует возможность пересчета коеф-тов КИХ фильтра так, что б получить два КИХ фильтра меньшей длины, и при "сложении" получить АЧХ изначального фильтра.
Тоесть, например, есть КИХ фильтр на 100 коэф-тов, нужно получить два фильтра по 50 коэф-тов.
Так, что б последовательное (или параллельное со сложением) дало результат по АЧХ, как при изначальном фильтре на 100 коеф-тов. Естественно delay не подходит, так как есть возможность применить всего 50 коэф-тов.
Возможно ли такое преобразование?
Спасибо
Интересует возможность пересчета коеф-тов КИХ фильтра так, что б получить два КИХ фильтра меньшей длины, и при "сложении" получить АЧХ изначального фильтра.
Тоесть, например, есть КИХ фильтр на 100 коэф-тов, нужно получить два фильтра по 50 коэф-тов.
Так, что б последовательное (или параллельное со сложением) дало результат по АЧХ, как при изначальном фильтре на 100 коеф-тов. Естественно delay не подходит, так как есть возможность применить всего 50 коэф-тов.
Возможно ли такое преобразование?
Спасибо
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: FIR = FIR1+FIR2
Можно один FIR заменить двумя короткими включенными последовательно (каскадно). Параллельное включение не пойдет. Для пересчета необходимо произвести деконволюцию (процедуру разложения полинома на множители) и тогда можно разбить фильтр на два каскадно- включенных.
Re: FIR = FIR1+FIR2
Другого, менее ресурсо-затратного способа не существует? Для контроллера это довольно тяжелая процедура.
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: FIR = FIR1+FIR2
Думаю что нет. А зачем вам делить один фильтр на два?
Re: FIR = FIR1+FIR2
Есть импульсный отклик - довольно длинный
есть два ДСП которые могут применить ФИР фильтр на ограниченное количество коэф-тов.
Если усечь импульс до длинны одного ДСП, то второй будет простаивать.
Поэтому есть желание "разбить" импульс так, что б получить более детальную АЧХ, как при более длинном импульсе, но средствами двух ФИР фильтров.
есть два ДСП которые могут применить ФИР фильтр на ограниченное количество коэф-тов.
Если усечь импульс до длинны одного ДСП, то второй будет простаивать.
Поэтому есть желание "разбить" импульс так, что б получить более детальную АЧХ, как при более длинном импульсе, но средствами двух ФИР фильтров.
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: FIR = FIR1+FIR2
если ваш импульсный отклик не меняется то вы можете однократно разделить его на два каскадных (используя матлаб например) и применять вашу структуру. Если он меняется то все сложнее вам придется производить его деконволюцию
Re: FIR = FIR1+FIR2
Сам импульсный отклик не меняется, он используется для формирования АЧХ.
Таких "откликов" много - в виде wav файлов. Мне нужно "на лету" уметь их "разделять" на два, как Вы говорите, каскадных. Деконволюция операция тут очевидна, но не реальна в плане реализации.
Если можете, опишите термины основные по теме разделения на "каскадные" импульсы, что б мог почитать об этом, ну или, если возможно, ликбез на эту тему, был бы крайне признателен!
Спасибо
Таких "откликов" много - в виде wav файлов. Мне нужно "на лету" уметь их "разделять" на два, как Вы говорите, каскадных. Деконволюция операция тут очевидна, но не реальна в плане реализации.
Если можете, опишите термины основные по теме разделения на "каскадные" импульсы, что б мог почитать об этом, ну или, если возможно, ликбез на эту тему, был бы крайне признателен!
Спасибо
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: FIR = FIR1+FIR2
код в матлабе (octave) пойдет?
Re: FIR = FIR1+FIR2
Подойдет любой удобный Вам способ!
Матлаб подходит.
Заранее спасибо
Матлаб подходит.
Заранее спасибо
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 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)