
Фильтр Чебышева (тип т)
Передаточная функция
Расчет «граничных» частот для ФНЧ:
Расчет параметра преобразования:
Граничная “аналоговая” частота k полосы задерживания аналогового фильтра-прототипа:
;
Передаточная функция АФ типа T:
Модуль коэффициента отражения:
%. Этой величине соответствует верхняя граница рабочего затухания в полосе пропускания
дБ.
|
5 |
10 |
15 |
25 |
50 |
Δa, дБ |
0,011 |
0,044 |
0,10 |
0,28 |
1,25 |
Таблица 1.
Модуль коэффициента отражения:
%.
Этой величине соответствует верхняя
граница рабочего затухания в полосе
пропускания
дБ.
Вспомогательный параметр L определяется для величин % ( дБ) и а0=20 дБ:
.
Номограмма 1
Порядок передаточной функции n определяется для величин и из номограммы для фильтров типа Т: n = 3.
Номограмма 2
Общий вид T(s):
В нашем случае, при n = 3, T(s) примет вид:
;
Коэффициенты T(s) найдем из таблицы:
-
5
0,20025047
1,5633880273
0,7816940137
0,6073139226
10
0,40201513
1,1717182911
0,5858591455
1,3340512791
15
0,60686608
0,9721338860
0,4860669430
1,2078009850
25
1,0327956
0,7433421107
0,3716710553
1,0790820730
50
2,3094011
0,4532218472
0,2266109236
0,9508194004
Таблица 2.
В нашем случае: C=0,40201513; a0=1,1717182911 -; a1= -0,5858591455; b1= 1,3340512791
Передаточная функция аналогового нормированного ФНЧ:
Передаточная функция H(z) цифрового ФНЧ определяется с использованием подстановки:
Расчет АЧХ и затухания аналогового фильтра по программе 1.
Для написания программы используем язык программирования Delphi6.0
Данная программа рассчитывает частоту фильтра, затухания, АЧХ.
Листинг программы:
nit Unit;// Расчет затухания аналогового фильтра.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Series, ExtCtrls, TeeProcs, Chart, DbChart, jpeg, Menus;
type
TForm1=class(TForm)
Button1: TButton;
Button2: TButton;
Edit1:TEdit;
Edit2:TEdit;
Edit3:TEdit;
Memo1:TMemo;
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
DBChart1:TDBChart;
Series1:TFastLineSeries;
DBChart2:TDBChart;
Series2:TFastLineSeries;
procedure Button1Click(Sender: TObject);
procedure.Button2Click(Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R . dfm}
procedure TForm1. Button1Click(Sender: TObject);
var
st:string;
q,i:integer;
dm,dw,c,w,w1,h,h1,s1,s2,s3,s4,g1,g2:real;
k,m,l,i,i1:integer;
B:array[1…10]of real; // введение коеффициента В
A:array[1…10]of real; // введение коеффициента A
FF:array[1…10]of real; // введение коеффициента k.
Form2:tform2;
begin
memo1.Clear;
c:=strofloat(edit1.Text); // введение коеффициента C
m:=strofloat(edit3.Text); // введение количества расчетных точек М
Form2:TForm2.Create(Application);
for i:=1 to k do
begin
form2.Label3.Caption:=’B[{‘+inttostr(l)+’,}’+ inttostr(i)+’]’;
form2.Label4.Caption:=’A[{‘+inttostr(l)+’,}’+ inttostr(i)+’]’;
form2.Label5.Caption:=’FF[{‘+inttostr(l)+’,}’+ inttostr(i)+’]’;
if Form2.ShowModal=mrOk then begin
B[i]:=strtofloat(form2.Edit1.Text);
A[i]:=strtofloat(form2.Edit2.Text);
FF[i]:=strtofloat(form2.Edit3.Text);
form2.Edit1.Text:=”;
form2.Edit2.Text:=”;
form2.Edit3.Text:=”;
form2.Label3.Caption := form2.Label3.Caption+#13+floattostr(b[i])+ ‘+floattostr(a[i])+ floattostr(FF[i]);
end;
end;
Dw:=(0.5)/(m-1);
for i1:=1 to k do
begin
w1:=2*3.141592*w;
h:=1;
for i:=1 to k do
begin
a[i]=0; b[i]=0;
begin
a[i]:=a[i]^2;
b[i]:=b[i]^2;
end;
h:=1/0.15171652*(FF[i]^2+2*a[i]*FF[i]+a[i]^2+b[i]^2);
end;
h:=p/sqr(+c^2);
if h<>0 then h1:= - 20ln(h)/(ln(10) else h1:=999;
dbchart1.SeriesList[0].Add(h,floattostr(w),clread);
dbchart2.SeriesList[0].Add(h,floattostr(w),clblue);
st:=floattostr(w)+ ‘ ‘+floattostr(h)+’ ‘+ floattostr(h1)+#13;
memo1.Lines.Add(st);
w:=w+dw;
end:
end;
procedure TForm1. Button2Click(Sender: TObject);
begin
close;
end;
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm2=class(TForm)
Edit1:TEdit;
Button1: TButton;
Edit2:TEdit;
Edit3:TEdit;
Memo1:TMemo;
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
Label4:TLabel;
Label5:TLabel;
private
{Private declarations}
public
{Public declarations}
end;
var
Form2: TForm2;
implementation
{$R . dfm}
end;
Листинг программы:
nit Unit;// Контрольный расчет АЧХ и затухания БИХ-фильтра по разработанной программе
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Series, ExtCtrls, TeeProcs, Chart, DbChart, jpeg, Menus;
type
TForm1=class(TForm)
Button1: TButton;
Button2: TButton;
Edit1:TEdit;
Edit2:TEdit;
Edit3:TEdit;
Memo1:TMemo;
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
DBChart1:TDBChart;
Series1:TFastLineSeries;
DBChart2:TDBChart;
Series2:TFastLineSeries;
procedure Button1Click(Sender: TObject);
procedure.Button2Click(Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R . dfm}
procedure TForm1. Button1Click(Sender: TObject);
var
st:string;
q,i:integer;
dm,dw,c,w,w1,h,h1,s1,s2,s3,s4,g1,g2:real;
k,m,l,i,i1:integer;
B:array[1…10]of real; // введение коеффициента В
A:array[1…10]of real; // введение коеффициента A
form2:tform2;
begin
memo1.Clear;
c:=strofloat(edit1.Text); // введение коеффициента C
m:=strofloat(edit3.Text); // введение количества расчетных точек М
k:=strofloat(edit1.Text); // введение количества звеньев К
Form2:TForm2.Create(Application);
for i:=1 to k do
for l:=1 to 3 do
begin
form2.Label3.Caption:=’B[{‘+inttostr(l)+’,}’+ inttostr(i)+’]’;
form2.Label4.Caption:=’A[{‘+inttostr(l)+’,}’+ inttostr(i)+’]’;
if Form2.ShowModal=mrOk then begin
B[l,i]:=strtofloat(form2.Edit1.Text);
A[l,i]:=strtofloat(form2.Edit2.Text);
form2.Edit1.Text:=”;
form2.Edit2.Text:=”;
form2.Label3.Caption := form2.Label3.Caption+#13+floattostr(b[l,i])+ ‘+floattostr(a[l,i]);
end;
end;
Dw:=(0.5)/(m-1);
for i1:=1 to k do
begin
w1:=2*3.141592*w;
h:=1;
for i:=1 to k do
begin
a[i]=0; b[i]=0;
begin
s1:=0; s2:=0; s3:=0; s4:=0;
for l:=1 to 3 do
begin
g1:=cos(1*w1); g2:= sin(1*w1);
s1:=s1+b[l,i]*g1; s2:=s2+b[l,i]*g2;
end;
h:=h*(sqr(s1)+ sqr(s2)/ sqr(s3)+ sqr(s4) ^2);
end;
h:=c*sqrt(h);
if h<>0 then h1:= - 20ln(h)/(ln(10) else h1:=999;
dbchart1.SeriesList[0].Add(h,floattostr(w),clread);
dbchart2.SeriesList[0].Add(h,floattostr(w),clblue);
st:=floattostr(w)+ ‘ ‘+floattostr(h)+’ ‘+ floattostr(h1)+#13;
memo1.Lines.Add(st);
w:=w+dw;
end:
end;
procedure TForm1. Button2Click(Sender: TObject);
begin
close;
end;
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm2=class(TForm)
Edit1:TEdit;
Button1: TButton;
Edit2:TEdit;
Memo1:TMemo;
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
Label4:TLabel;
private
{Private declarations}
public
{Public declarations}
end;
var
Form2: TForm2;
implementation
{$R . dfm}
end;
Рисунок 1. Изображение окна работающего приложения
Рисунок 2. Изображение графика зависимости АЧХ от частоты
Рисунок 3. Изображение графика зависимости затухания от частоты
Передаточной функции H(z) соответствует схема:
z-1
z-1
z-1
x
(nT)
z-1
z-1
z-1
0,174243 0,174243 -0,318486
-0,03
y(nT)
10,5867
37,6471 45,2432
18,5029
Рис 1 «Схема фильтра»
Расчёт аналогового фильтра прототипа:
>> [z, p, k]=cheb2ap(3,40);
>> [b, a]=zp2tf(z, p, k); % преобразование коэффициента усиления
>> h=freqs(b, a, w); % передаточная функция аналогового фильтра
>> figure
>> plot(w, abs(h)), grid
Рис 2. «АЧХ фильтра»
Преобразование фильтра прототипа к заданному типу (ФНЧ):
>> [z, p, k]=cheb2ap(3, 40);
>> [b, a]=zp2tf(z, p, k);
>> w0=1;
>> [b, a]=lp2hp(b, a, w0); % преобразование фильтра прототипа к ФНЧ
>> freqz(b, a);
Рис 3 АЧХ и ФЧХ ФНЧ
Синтез дискретных фильтров методом билинейного z-преобразования:
>> Fs=1;
>> [bz, az] = bilinear(b, a, Fs);
>> freqz(bz, az);
Рис 4 АЧХ и ФЧХ дискретного фильтра