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.. Chương trình C sau đây sẽ chi
Trang 1C j!
=
N
0 i j
0 k
i k
i k
i k i k i N k
ở đây
n
m
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ố b j và a i:
N
i j
k
i k j i N k j k i k i N k j i k
b
0 0
) ( ) (
Nếu vector (N + 1) cột b = [b 0 , b 1 , , b N ] T và vector (N + 1) cột a = [ a 0 , a 1 , .,a N ] 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:
j
k
k j i N k i k i k i N k j i k
ij C C q
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
m N
n
n m mn
N
m N
n
n m mn
z z b
z z a z
z H
0 0
2 1
0 0
2 1 2
1, )
Và hàm truyền đạt của bộ lọc 2-D tương tự được cho bởi
N m
N n
n m mn
N m
N n
n m mn
z s d
z s c z
s H
0 0
0 0
) ,
Các hệ số c phụ thuộc vào các hệ số a theo công thức
Trang 2Ở đây T
Nn n
n n
c 0 , 1 , 2 , ,
_
Nn n
n n
a 0 , 1 , 2 , ,
_
, 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 <stdio.h>
#include <math.h>
#include <alloc.h>
#include <io.h>
#include <conio.h>
#include <process.h>
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();
Trang 3printf("\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++)
{
Trang 4temp[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");
Trang 5printf("\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<M2;i++)
{
fprintf(fptro1," %e",wd);
fprintf(fptro2," %e",wd);
wd+=dwd;
}
phase=(float **)malloc(M2*sizeof(float *));
for(i=0;i<(M2);i++)
*(phase+i)=(float *)malloc(M2*sizeof(float));
wa=wa_start;
wd=-pi ;
dwa=2.0*pi/(M*T);
dwd=2.0*pi/M;
for(j=0;i<M2;i++)
{
fprintf(fptro1,"\n%e",wa*T);
for(j=0;j<M2;j++)
{
NR=NI=0.0;
DR=DI=0.0;
for(n=0;n<=N;n++)
{
c=cos(n*wd);
s=sin(n*wd);
sign=1;
wame=1.0;
was=wa*wa;
sum1=sum2=0.0;
for(m=0;m<=N;m+=2)
{
Trang 6t1=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++)
{
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.*/
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))
{