
Проектирование бих-фильтра в графической среде fdaTool
Для проверки истинности результатов проведем синтез КИХ-фильтра в графической среде FDATool.
При
этом приведем основные характеристики
фильтра.
АЧХ фильтра, сходится с рассчитанной ранее
ФЧХ фильтра, так же сходится
Импульсная, переходная характеристики и диаграмму полюсов и нулей так же соответствуют полученным ранее в расчете.
Импульсная характеристика
Переходная
характеристика
Диаграмма нулей и полюсов
Фильтры рассчитанные в среде FDAtool и с помощью системы MatLab идентичны.
Matlab-программа синтеза бих-фильтра
close all;
clear all;
clc;
f_d = 30000; w_d = 2*pi*f_d; %Частота дискретизации
F_p = 1000; w_p = 2*pi*F_p; %Частота среза
R_p = 0.7; R_s = 55; %Заданные допуски на ЛАЧХ
F_s = 7000; w_s = 2*pi*F_s; %Граничная частота
[N, W_0] = cheb1ord(w_p,w_s,R_p,R_s,'s'); %Расчитываем минемально необходимый порядок и частоту среза фильтра
[b, a] = cheby1(N,R_p,W_0,'s'); %Рассчитаем коэфф. передаточной функции АФ
W = 0:5:w_d/2;
H = freqs(b,a,W); %Вычисление отсчетов комплексной АЧХ
ACH = abs(H); %Вычисление АЧХ
LACH = 20*log10(ACH); %Вычисление логарифмической АЧХ
FCH = unwrap(angle(H))*180/pi; %Вычисление ФЧХ
%Построение частотных характеристик
figure('name','Частотные характеристики');
subplot(2,1,1);
plot(W/(2*pi),ACH);
hold on;
plot([0 W_0/(2*pi) 1.00001*W_0/(2*pi) w_d/(4*pi)], [1 1 0 0], '-.r');
grid on;
legend('ACH AF','ACH IdealF');
title('ACH');
xlabel('f, Hz');
ylabel('Amplitude');
subplot(2,1,2);
plot(W/(2*pi),FCH);
grid on;
title('FCH');
xlabel('f, Hz');
ylabel('Fase(gradus)');
%Построение ЛАЧХ
figure('name','Логарифмическая АЧХ');
plot(W/(2*pi),LACH);
grid on;
title('LACH');
xlabel('f, Hz');
ylabel('Amplitude(dB)');
%Построение диаграммы полюсов
figure('name', 'Диаграмма полюсов АФ');
[z, p, k] = zplane(b,a);
grid on;
xlabel('Real');
ylabel('Imag');
%БП
[z, p, k] = tf2zp(b, a);
z_CF = (2*f_d+z)./(2*f_d-z);
p_CF = (2*f_d+p)./(2*f_d-p);
k_CF = k * prod(2*f_d - z)/prod(2*f_d - p);
Num = length(z) - length(p);
switch (Num > 0)
case 0
z_CF = [z_CF; ones(abs(Num),1)*(-1)];
case 1
p_CF = [p_CF; ones(abs(Num),1)*(-1)];
end
[bz, az]=zp2tf(z_CF, p_CF, k_CF);
[bz1, az1] = bilinear(b,a,f_d);
[zz, pz, kz] = bilinear(z, p, k, f_d);
%Построение диаграммы нулей и полюсов ЦФ
figure('name', 'Диаграмма нулей и полюсов ЦФ');
zplane(bz, az);
grid on;
xlabel('Real');
ylabel('Imag');
%Решение разностного уравнения методом итерационной процедуры
x=ones(1, 100);
h1 = impz(bz,az,100);
x1=zeros(1,length(h1)-20);
x1 = [x,x1];
for n = 1:length(h1)
y(n) = 0;
for m=1:n
y1= x1(m)*h1(n-m+1);
y(n)=y(n)+y1;
end;
end;
figure('name', 'Кривая переходного процесса');
stem(0:length(x)-1, y(1:length(x)));
grid on;
%Построение переходной и импульсной характеристики
figure('name', 'Переходная и импульсная х-ки');
pereh = filter(bz, az, ones(1, length(h1)));
subplot(2,1,1);
stem((0:length(h1)-1), h1);
grid on;
title('Impulsnaja');
xlabel('n');
ylabel('Amplitude');
xlim([0 length(h1)]);
subplot(2,1,2);
stem((0:length(pereh)-1), pereh);
grid on;
title('Perehodnaja');
xlabel('n');
ylabel('Amplitude');
xlim([0 length(h1)]);
%Построение реакции фильтра на различные входные сигналы
figure('name', 'Реакция фильтра на различные входные сигналы');
f1 = 400;
f2 = 2500;
t_sign = 0:1/f_d:0.01;
signal_1 = 10*sin(2*pi*f1*t_sign);
signal_2 = 10*sin(2*pi*f2*t_sign);
vyx1 = filtfilt(bz, az, signal_1);
vyx2 = filtfilt(bz, az, signal_2);
subplot(2,2,1);
plot(t_sign, signal_1, 'r-');
grid on;
title('800 Hz');
subplot(2,2,2);
plot(t_sign, vyx1, 'k-');
grid on;
subplot(2,2,3);
plot(t_sign, signal_2, 'r-');
grid on;
title('2000 Hz');
subplot(2,2,4);
plot(t_sign, vyx2, 'k-');
grid on;
%Построение частотных характеристик ЦФ
figure('name', 'Частотные характеристики фильтра');
[H_CF W_CF] = freqz(bz,az);
ACH_CF = abs(H_CF);
LACH_CF = 20*log10(ACH_CF);
FCH_CF = angle(H_CF);
FCH_CF = unwrap(FCH_CF); %Устранение скачков
subplot(2,1,1);
plot(W_CF*f_d/(2*pi),ACH_CF,'k');
grid on;
hold on;
plot(W/(2*pi),ACH,'-.g')
title('ACH');
xlabel('f, Hz');
ylabel('Amplitude');
legend('ACH CF','ACH AF');
subplot(2,1,2);
plot(W_CF*f_d/(2*pi),FCH_CF*180/pi,'k');
grid on;
hold on;
plot(W/(2*pi),FCH,'-.g')
title('FCH');
xlabel('f, Hz');
ylabel('Fase(gradus)');
legend('FCH CF','FCH AF');
figure('name', 'Логарифмическая АЧХ');
plot(W_CF*f_d/(2*pi),LACH_CF);
hold on;
%построение границы полос пропускания и задержки
plot([F_s, F_s], [-250, -R_s], 'r--');
plot([F_s, max(W_CF*f_d/(2*pi))], [-R_s, -R_s], 'r--');
plot([F_p, F_p], [50, -R_p], 'r--');
plot([0, F_p], [-R_p, -R_p], 'r--');
hold off;
grid on;
xlabel('f, Hz');
ylabel('Amplitude(dB)');
%Построение ЛАЧХ ЦФ в функции абсолютной псевдочастоты
lam = 2*f_d*tan(W_CF*f_d/(4*f_d));
lam_p = 2*f_d*tan(w_p/(2*f_d));
lam_s = 2*f_d*tan(w_s/(2*f_d));
figure('name', 'Логарифмическая АЧХ в функции абсолютной псевдочастоты');
plot(lam,LACH_CF);
hold on;
%построение границы полос пропускания и задержки
plot([lam_s, lam_s], [-215, -R_s], 'r--');
plot([lam_s, max(lam)], [-R_s, -R_s], 'r--');
plot([lam_p, lam_p], [50, -R_p], 'r--');
plot([0, lam_p], [-R_p, -R_p], 'r--');
hold off;
axis([0 lam(length(lam)) LACH_CF(length(LACH_CF)) 50]);
grid on;
xlabel('lam');
ylabel('Amplitude(dB)');
[sos,g] = tf2sos(bz,az)