Существуют КИХ и БИХ цифровые фильтры. ИХ передаточные функции можно представить в виде отношения полиномов, только у КИХ фильтра в знаменателе единица. Также фильтр можно описать с помощью импульсной характеристики. Прохождение сигнала через цифровой фильтр можно представить в виде свертки входного сигнала с импульсной характеристикой фильтра или в виде произведения их Z-отображений. С помощью filterDesigner на MatLab делаю КИХ фильтр (Fs=1500Hz, Fpass=2Hz, Fstop=49Hz, Apass=1dB, Astop=40dB), вот его передаточная функция:
Код:
Numerator:
0.01119255071394242156967990808880131226
0.005285121732642928359113820846459930181
0.006453581365537312992952667656254561734
0.007725825762473693958387599423076608218
0.009090659071237384980523899002946563996
0.010538722323502534156114407437598856632
0.012060116080200685567680451981686928775
0.013639614943877510430669808272341470001
0.015262795458380436913747857374801242258
0.016906176170626591170886854342825245112
0.018548456419688535284917563217277347576
0.020175528355832212518139456847166002262
0.021770156456097790320658447171808802523
0.02329706838380501965346525139466393739
0.024739992763880815085375530770761542954
0.026098068501571158178675702288273896556
0.027318053088047904164437085228200885467
0.028411008662171853555999945228904834948
0.029343935698295488950781972903314454015
0.030107215108137921899533751002309145406
0.030691429274293541978879673592928156722
0.031086098153798483872956026630163250957
0.031282384974124929910566095259127905592
0.031282384974124929910566095259127905592
0.031086098153798483872956026630163250957
0.030691429274293541978879673592928156722
0.030107215108137921899533751002309145406
0.029343935698295488950781972903314454015
0.028411008662171853555999945228904834948
0.027318053088047904164437085228200885467
0.026098068501571158178675702288273896556
0.024739992763880815085375530770761542954
0.02329706838380501965346525139466393739
0.021770156456097790320658447171808802523
0.020175528355832212518139456847166002262
0.018548456419688535284917563217277347576
0.016906176170626591170886854342825245112
0.015262795458380436913747857374801242258
0.013639614943877510430669808272341470001
0.012060116080200685567680451981686928775
0.010538722323502534156114407437598856632
0.009090659071237384980523899002946563996
0.007725825762473693958387599423076608218
0.006453581365537312992952667656254561734
0.005285121732642928359113820846459930181
0.01119255071394242156967990808880131226
Далее делаю фильтр с такими же характеристиками, но уже БИХ:
Код:
Numerator:
1
2
1
Denominator:
1
-1.970873147296126504102176113519817590714
0.971291288216304504743447978398762643337
Для КИХ фильтра коэффициенты при z в передаточной функции совпадают с импульсной характеристикой фильтра. Получается, что для КИХ фильтра я могу посчитать свёртку входного сигнала и импульсной характеристики и получить выходной сигнал? Вот пример, написанный на MatLab (и выходной график ниже):
Код:
Ts = 1/1500;
t = 0 : Ts : 3;
f = 50;
phi = pi/2;
s = 5 + 2.5*sin(2*pi*f*t + phi); %Входной сигнал
h = [0.01119255071394242156967990808880131226 %Импульсная хар-ка КИХ-фильтра
0.005285121732642928359113820846459930181
0.006453581365537312992952667656254561734
0.007725825762473693958387599423076608218
0.009090659071237384980523899002946563996
0.010538722323502534156114407437598856632
0.012060116080200685567680451981686928775
0.013639614943877510430669808272341470001
0.015262795458380436913747857374801242258
0.016906176170626591170886854342825245112
0.018548456419688535284917563217277347576
0.020175528355832212518139456847166002262
0.021770156456097790320658447171808802523
0.02329706838380501965346525139466393739
0.024739992763880815085375530770761542954
0.026098068501571158178675702288273896556
0.027318053088047904164437085228200885467
0.028411008662171853555999945228904834948
0.029343935698295488950781972903314454015
0.030107215108137921899533751002309145406
0.030691429274293541978879673592928156722
0.031086098153798483872956026630163250957
0.031282384974124929910566095259127905592
0.031282384974124929910566095259127905592
0.031086098153798483872956026630163250957
0.030691429274293541978879673592928156722
0.030107215108137921899533751002309145406
0.029343935698295488950781972903314454015
0.028411008662171853555999945228904834948
0.027318053088047904164437085228200885467
0.026098068501571158178675702288273896556
0.024739992763880815085375530770761542954
0.02329706838380501965346525139466393739
0.021770156456097790320658447171808802523
0.020175528355832212518139456847166002262
0.018548456419688535284917563217277347576
0.016906176170626591170886854342825245112
0.015262795458380436913747857374801242258
0.013639614943877510430669808272341470001
0.012060116080200685567680451981686928775
0.010538722323502534156114407437598856632
0.009090659071237384980523899002946563996
0.007725825762473693958387599423076608218
0.006453581365537312992952667656254561734
0.005285121732642928359113820846459930181
0.01119255071394242156967990808880131226 ]';
s_out = conv(s, h); %Свертка входного сигнала и импульсной хар-ки фильтра
s_out2 = filter(h, 1, s);
figure
subplot(3, 1, 1)
plot(s)
grid on
xlabel('t')
ylabel('s')
title('Входной сигнал')
subplot(3, 1, 2)
plot(s_out)
grid on
xlabel('t')
ylabel('s')
title('Выходной сигнал (conv)')
subplot(3, 1, 3)
plot(s_out2)
grid on
xlabel('t')
ylabel('s')
title('Выходной сигнал (filter)')
В описании сказано, что функция filter выдаёт вектор той же длины, что и входной сигнал, то есть, видимо, просто обрубает конец. Но в принципе понятно, что программа выдаёт рабочий фильтр и что функция filter работает адекватно. НО по чему для КИХ фильтра такой коэффициент подавления для постоянной составляющей? Было 5 а стало 4.5, то есть получается, что в этом плане КИХ фильтр хуже (просто далее для БИХ фильтров такого не наблюдается, там в полосе пропускания всё хорошо)? Конечно, по АЧХ фильтра можно этот коэффициент подавления достать и потом скомпенсировать, но неужели нельзя этого избежать? Или, может, то особенность выбранного типа фильтра (Equiripple)?
Переходим к БИХ, вот пример на MatLab:
Код:
Ts = 1/1500;
t = 0 : Ts : 3;
f = 50;
phi = pi/2;
s = 5 + 2.5*sin(2*pi*f*t + phi); %Входной сигнал
b = [1 2 1];
a = [1 -1.971 0.971];
s_out = filter(b, a, s);
figure
subplot(2, 1, 1)
plot(s)
grid on
xlabel('t')
ylabel('s')
title('Входной сигнал')
subplot(2, 1, 2)
plot(s_out)
grid on
xlabel('t')
ylabel('s')
title('Выходной сигнал (filter)')
Что я сделал не так? В программе написано, что фильтр устойчив, с этим проблем быть не должно.