(
iN
(
kj
)
)
j
N
k
ki
j! =
i C
C
ki
(15.18)
iN kj
a i
k
0=i
0=k
m
0m
ở đây
và
nC
C m n
n
Cho tất cả m < n. Cân bằng các biểu thức (15.17) và (15.18) cho ta mối quan hệ
giữa các hệ số bj và ai:
b
( ki
a
(15.19)
j N k kj iN () kj ) j i CC k iN kj i
Nếu vector (N + 1) cột b = [b0, b1, ..., bN]T và vector (N + 1) cột a = [ a0, a1, ...,aN]T biểu diễn các hệ số chuyển đổi và hệ số gốc thì b được tính theo a qua phép nhân ma trận
b = Qa (15.20)
Ở đây qịj là các phần tử của ma trận Q, cho như sau:
i 0 k 0
(15.21)
q ij
j k ki iN kj ki i CC k iN kj
k 0
15.4 Chuyển một bộ lọc số 2-D thành bộ lọc 2-D tương tự
Đầu tiên thiết kế một bộ lọc số 2-D dùng kỹ thuật mô tả trong các chương trước, chúng ta có thể chiếu bộ lọc này thành bộ lọc 2-D tương tự dùng biến đổi song tuyến tính cho trong biểu thức (15.11). Nếu hàm truyền đạt của bộ lọc số 2-D cho bởi:
N
N
m
n
z
za 1 mn
2
m
0
n
,
)
(15.22)
( zzH 1
2
N
0 N
m
n
z
zb 1 mn
2
m
0
n
0
Và hàm truyền đạt của bộ lọc 2-D tương tự được cho bởi
N
N
c
nm z
s
mn
0
),( zsH
(15.22)
0 n m N N
d
nm z
s
mn
m
0 n
0
Các hệ số c phụ thuộc vào các hệ số a theo công thức
_ Q a
(15.24)
_ c n
n
_ c
_ a
,
,
,
,
c
c
a
,...,
,...,
a
và
c
T
a
T
0
n
n
0
2
n
n
n
Nn
c 1 n
a 1 n
Nn
n
2
Ở đây , và tương tự cho các hệ số d và a. Q là một ma trận (N + 1) (N + 1) toàn bộ các phần tử cho bởi biểu thức (15.21). Chu kỳ lấy mẫu T dùng cho biến đổi song tuyến tính được chọn bằng chu kỳ quét dòng của tín hiệu truyền hình, và bằng 63.555 micro giây cho tiêu chuẩn U.S. NTSC. Lý do của việc này là làm cho bộ lọc tuần hoàn đối xứng ở trong miền chữ nhật bao bởi a = {-/T,/T} và u = {-/T, /T}, ở đây a là tần số tương tự theo chiều ngang và d là tần số số theo chiều dọc.
Chương trình C sau đây sẽ chiếu hàm truyền đạt IIR 2-D số vào hàm truyền
đạt tương tự.
Chương trình 15.1 “ANA2DIIR.C” Chuyển bộ lọc 2-D số vào bộ lọc 2-D
tương tự.
/* This program is for mapping a 2-D IIR filter
to a 2-D analog filter. It also provides you
with data files for Plotting magnitude and
phase response. */
#define T 63.555e-6
#define pi 3.14159
#define Tt (T)
#define M2 (M)
#define wa_start (-pi/T)
#include
#include
#include
#include
#include
#include
void Transf_matrix(float *,int);
main()
{
float
**a,**b,**temp,*Q,c,s,NR,NI,DR,DI,D,ph,wa,wd,dwa,dwd;
float wame,wamo,was,sum1,sum2,t1,t2,ph1,ph2,**phase;
int i,j,m,n,sign,N,M,k;
FILE *fptr,*fptro1,*fptro2;
char file_name[14];
clrscr();
printf("\nEnter file name containing IIR filter coefficients-->"); scanf("%s",file_name); fptr=fopen(file_name,"r"); if(fptr==NULL) { printf("\nThis file does not exist."); exit(1); } fscanf(fptr,"%d",&N); a=(float **)malloc((N+1)*sizeof(float *)); for(i=0;i<=N;i++) *(a+i)=(float *)malloc((N+1)*sizeof(float)); b=(float **)malloc((N+1)*sizeof(float *)); for(i=0;i<=N;i++) *(b+i)=(float *)malloc((N+1)*sizeof(float)); for(i=0;i<=N;i++) for(j=0;j<=N;j++) { fscanf(fptr,"%e %e ",&a[i][j],&b[i][j]); printf("\n%e %e",a[i][j],b[i][j]); } printf("\n\n"); fclose(fptr); /*Generating the transformation matrix. */ Q=(float *)malloc((N+1)*(N+1)*sizeof(float)); Transf_matrix(Q,N); /* for(i=0;i<=N;i++) { printf("\n"); for(j=0;j<=N;j++) printf("%f ",Q[i*(N+1)+j]); }*/ temp=(float **)malloc((N+1)*sizeof(float *)); for(i=0;i<=N;i++) *(temp+i)=(float *)malloc((N+1)*sizeof(float)); /* Transforming the a-coefficients. */ for(n=0;n<=N;n++) { for(i=0;i<=N;i++) {
temp[i][n]=0.0; for(j=0;j<=N;j++) temp[i][n]+=Q[i*(N+1)+j]*a[j][n]; } } for(i=0;i<=N;i++) for(j=0;j<=N;j++) a[i][j]=temp[i][j]; /* Transforming the b-coefficients. */ for(n=0;n<=N;n++) { for(i=0;i<=N;i++) { temp[i][n]=0.0; for(j=0;j<-N;j++) temp[i][n]+=Q[i*(N+1)+j]*b[j][n]; } } for(i=0;i<=N;i++) for(j=0;j<=N;j++) b[i][j]=temp[i][j]; printf("\nEnter file name to store"); printf(" coeffts. of 2-D analog filter-->"); scanf("%s",file_name); fptr=fopen(file_name,"w"); fprintf(fptr,"%d",N); temp[0][0]=b[0][0]; for(i=0;i<=N;i++) for(j=0;j<=N;j++) { a[i][j]/=temp[0][0]; b[i][j]/=temp[0][0]; fprintf(fptr,"\n%e %e ",a[i][j],b[i][j]); printf("\n%e %e",a[i][j],b[i][j]); } fclose(fptr); printf("\nEnter file name to store magnitude response-- >"); scanf("%s",file_name); fptro1=fopen(file_name,"w");
printf("\nEnter file name to store phase response-->");
scanf("%s",file_name);
fptro2=fopen(file_name,"w+");
printf("\nEnter the number of points to be generated
(e.g.32x32)-->");
scanf("%dx%d",&M,&M);
fprintf(fptro1,"%d %d\n",M2,M2);
fprintf(fptro2,"%d %d\n",M2,M2);
fprintf(fptro1,"%e",0.0);
fprintf(fptro2,"%e",0.0);
wd=- pi;
dwd=2.0*pi/M;
for(i=0;i c=cos(n*wd);
s=sin(n*wd);
sign=1;
wamo=wa;
was=wa*wa;
sum1=sum2=0.0;
for(m=1;m<=N;m+=2)
{
t1=sign*a[m][n]*wamo;
t2=sign*b[m][n]*wamo;
sign*=-1;
wamo*=was;
sum1+=t1 ;
sum2+=t2 ;
}
NR-=sum1*s;
NI+=sum1*c;
DR-=sum2*s;
DI+=sum2*c;
} /*n-loop.*/ t1=sign*a[m][n]*wame;
t2=sign*b[m][n]*wame;
sign*=-1;
wame*=was;
sum1+=t1;
sum2+=t2;
}
NR+=sum1*c;
NI+=sum1*s;
DR+=sum2*c;
DI+=sum2*s;
} /*n-loop.*/
for(n=0;n<=N;n++)
{
D=sqrt(NR*NR+NI*NI)/sqrt(DR*DR+DI*DI);
ph=atan2(NI,NR)-atan2(DI,DR);
if(j==0) ph1=ph;
else
{
ph2=ph;
if(fabs(ph2-ph1)>=(1.9*pi))
{