2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Не могу разобраться в работе цифровых фильтров
Сообщение09.04.2023, 21:51 
Существуют КИХ и БИХ цифровые фильтры. ИХ передаточные функции можно представить в виде отношения полиномов, только у КИХ фильтра в знаменателе единица. Также фильтр можно описать с помощью импульсной характеристики. Прохождение сигнала через цифровой фильтр можно представить в виде свертки входного сигнала с импульсной характеристикой фильтра или в виде произведения их 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)')

Изображение
Что я сделал не так? В программе написано, что фильтр устойчив, с этим проблем быть не должно.

 
 
 
 Re: Не могу разобраться в работе цифровых фильтров
Сообщение13.04.2023, 10:56 
Аватара пользователя
Kevsh в сообщении #1589043 писал(а):
Denominator:
1
-1.970873147296126504102176113519817590714
0.971291288216304504743447978398762643337

Kevsh в сообщении #1589043 писал(а):
a = [1 -1.971 0.971];


?

 
 
 
 Re: Не могу разобраться в работе цифровых фильтров
Сообщение13.04.2023, 14:03 
Аватара пользователя
Фильтр НЧ? И вообще, как генерировался фильтр?

 
 
 
 Re: Не могу разобраться в работе цифровых фильтров
Сообщение24.04.2023, 14:30 
Евгений Машеров
Да, действительно, из-за округления фильтр потерял устойчивость. Я почему-то думал, что округлить можно (у меня просто пока что только в планах разобраться, как все эти фильтры создаются, так что я не до конца понимаю, что влияет на устойчивость). Фильтр разрабатывался с помощью filterDesigner в MatLab.

 
 
 
 Re: Не могу разобраться в работе цифровых фильтров
Сообщение24.04.2023, 20:24 
Аватара пользователя
А посмотрите, где (по отношению к единичной окружности) нули полинома с исходными и округлёнными коэффициентами.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group