Cj! = N 0=i )()( j 0=k i k i kjiN kikikiN kj aC (15.18) ở đây n m C m n và 0 m n C 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 kjiNkjkikiN kj i kj aCCb 0 0 )()( (15.19) 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 kjiNkikikiN kj i kij CCq 0 (15.21) 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 nm mn N m N n nm mn zzb zza zzH 0 0 21 0 0 21 21 ),( (15.22) Và hàm truyền đạt của bộ lọc 2-D tương tự được cho bởi N m N n nm mn N m N n nm mn zsd zsc zsH 0 0 0 0 ),( (15.22) Các hệ số c phụ thuộc vào các hệ số a theo công thức c Qa n n _ _ (15.24) Ở đây T Nnnnnn ccccc , ,,, 210 _ và T Nnnnnn aaaaa , ,,, 210 _ , 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(); 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<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) { 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++) { 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)) { . (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. ở đ 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.21) 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