Xem mẫu

  1. 3. Để bộ lọc có bậc N  N, N lẻ, hệ số bộ lọc (giá trị của h(m,n)) chứa trong  M ( N  1) M N  1  một cửa sổ kéo dài từ đến  ,  2 2 2 2  M ( N  1) M N  1  .  , 2 2 2 2 4. Các bước trên có liên quan đến việc sử dụng hàm cửa sổ hình chữ nhật mà nó có thể được mô tả như sau:  M N  1  M N  1  w(m,n) = 1 với    m    2  2 2 2    M N  1  M N  1  (8.1)     n   2  2  2 2   = 0 với các trường hợp còn lại. Các hệ số của bộ lọc cho bởi h(m,n)w(m,n) Hình 8.1 ch ỉ ra phổ biên độ của bộ lọc 5  5 được thiết kế sử dụng cửa sổ hình chữ nhật và tận dụng các đặc điểm: 0 v íi    2   2  0,8 rad s  c 1 2 H ( 1 ,  2 )   1 cho c¸c tr­êng hîp cßn l¹i.  Những dao động trong giải thông rất đáng đ ược chú ý. Các dao động do sự hội tụ chậm của các hệ số trong chuỗi Fourier cho sự chuyển đổi đột ngột về đặc tính tần số -biên độ. Nhắc lại rằng đáp ứng tần số được coi như tuần hoàn và IFFT về cơ bản cùng dẫn đến hệ số Fourier của hàm tu ần hoàn. Đây cũng là đáp ứng xung hay hệ số của bộ lọc FIR. 8.3 Hàm cửa sổ Các hàm cửa sổ để làm giảm bớt các dao động Gibbs được rút ra từ thiết kế của bộ lọc FIR 1-D. Các hàm cửa sổ hay đư ợc được sử dụng nhất sẽ không liệt kê theo bảng dưới đây cùng sự mở rộng của chúng sang trường hợp 2 -D. ¦Cửa sổ Hann và Hamming. Cửa sổ Hann và Hamming cho bởi N 1 2n với |n|     1    cos 2 W H ( n)   N 1 với các trường hợp còn lại. 0  (8.2) 147
  2. Có hai lựa chọn khác nhau của . Trong cửa sổ Hann  = 0.5 và trong cửa sổ Hamming  = 0. 54. Bậc của bộ lọc được cho là N. ¦Cửa sổ Blackmann. Cửa sổ Blackmann cho bởi :   4n với |n|  N  1 2n  (8.3) WB ( n )  0,42  0,5 cos  0,08 cos 2 N 1 N 1  với các trường hợp còn  0  lại Các thành ph ần cosin thêm vào dẫn đến sự suy giảm biên độ của các dao động Gibbs. ¦Cửa sổ Kaiser. Cửa sổ Kaiser cho bởi  I 0 (  ) với |n|  N  1  2 (8.4) WK (n)   I 0 ( ) với các trường hợp còn lại 0  H ình 8.1 Đáp ứng tần số của bộ lọc FIR với c = 0.8. ở đ ây  là tham số độc lập và 2  2n     1    N  1 148
  3. I0(x) là hàm Bessel bậc 0 loại 1. Nó có thể ước lượng đến độ chính xác bất kỳ bởi dùng một dãy hội tụ 2  1 x k  I0(x) = 1 +         k 1  k ! 2  Hàm cửa sổ 2 -D cơ bản dựa trên các hàm cửa sổ 1 -D cung cấp ở trên. Sự mở rộng của bất kỳ h àm cửa sổ 1 -D nào ở trên sang 2-D được tiến hành b ằng cách thay thế n bằng 2 2 n1  n2 2 (8.5) Chia cho 2 để đảm bảo rằng giá trị của n không vượt quá (N - 1)/2, giá trị lớn nhất trong trường hợp 1 -D. Hàm cửa sổ 2-D được sinh ra từ hàm cửa sổ 1-D qua các biểu thức: w(n 1,n2) = w(n 1)w(n 2 ) (8.6) Ứng dụng của hàm cửa sổ trên được rút ra đơn giản bằng thay thế đáp ứng xung h (n1,n2) b ằng h(n1,n2)w(n 1,n2). Chương trình sau cho phép bạn thiết kế bất kỳ bộ lọc cửa sổ chữ nhật hay bất kỳ cửa sổ n ào được mô tả trong phần trước bằng cách dùng biểu thức (8.5) để mở rộng từ 1-D sang 2 -D. Bộ lọc trong chương trình này đư ợc thiết kế dùng FFT 2 -D, loại cửa sổ được chọn bởi người dùng. Chương trình 8.1 "FIRD.C" Thiết kế các bộ lọc dùng FFT và các hàm cửa sổ. /* Program for designing FIR filter using FFT on prescribed frequency specifications.Option for selecting a Window function is provided. For the magnitude-frequency specifications you can either supply your own data or select from a menu of standard functions. If you supply your own data the first two values should be the dimensions of the 2-D array e.g. 32 32. These dimensions should be equal to some power of 2. The data that follows is the magnitude specifications in "%f " format stored in a row by row fashion with no return code after every row.*/ #define pi 3.141592654 149
  4. #include #include #include #include #include #include #include #include #include void bit_reversal(unsigned int *, int , int); void WTS(float *, float *, int, int); void FFT(float *xr, float *xi, float *, float *,int, int) ; void transpose(FILE *, int, int); void FFT2D(FILE *, FILE *, float *, float *, unsigned int *, int,int , int) ; void main() { int M,M1,m,n2,i,j,ii,jj,k; int Nt,n,M2,M3,N,N1,ind,yt; unsigned int *L; float *wr,*wi,Do,winc,Do1,Do2; float win,T,alpha,beta,sum1,sum2; float nsq,nsqrt; FILE *fptri,*fptro,*fptr; float *buffi,*buffo,R2,H; float xrm,xim,xrn,xin,zrt,zit,mag,theta; float *w,**h,r1,im; unsigned char file_name[14], ch,ch1,choice,file_name1[14]; clrscr() ; printf("Freq. response can be calculated using standard \n"); printf(" functions which you can select from a menu if your\n"); printf(" reply to the following question is negative.\n"); printf("Is freq. response provided in a file? (y or n)-->"); while(((ch1=getch())!='y')&&(ch1!='n')); 150
  5. putch(ch1); switch(ch1) { case 'n': printf("\n Enter # of points to be generated (e.g. 32x32)-->"); scanf("%dx%d",&M1,&M1); break ; case 'y': printf("\nEnter name of file storing magnitude response-->"); scanf("%s",file_name1); fptr=fopen(file_name1,"r"); fscanf(fptr,"%d %d 11,01,&Mi"); } M=M1>>1 ; yt=wherey(); again1 : gotoxy(1,yt); printf( " "); gotoxy(1,yt); printf("Enter file name for storing impulse response--->"); scanf("%s",file_name); if(((stricmp("FFT.DAT",file_name))==0)|| ((stricmp("TEMP.DAT",file_name))==0)|| ((stricmp("IFFT.DAT",file_name))==0)) printf("This is a reserved file name. Use some other name."); goto again1; gotoxy(1,yt); printf ( " "); ind=access(file_name,0); while(!ind) { gotoxy(1,yt+1); printf ( " "); gotoxy(1,yt+1); printf("File exists. Wish to overwrite? (y or n)- ->"); while(((ch=tolower(getch()))!='y')&&(ch1='n')); 151
  6. putch(ch); switch(ch) { case 'y' : ind=1 ; break; case 'n' : gotoxy(1,yt+1); printf(" "); gotoxy(1,yt); printf("Enter file name -->"); scanf("file_name"); ind=access(file_name,0); } } fptri=fopen("FFT.DAT","wb+"); fptro=fopen("IFFT.DAT","wb+"); buffi=(float *)malloc((M1
  7. printf(" Enter 1 or 2 --- >"); while(((choice=getche())!='1')&&(choice!='2')); printf("\n"); break; case '3': case '4': printf ("\nEnter lower cut-off freq. in rad./sec. (cut-off
  8. if(choice=='2') H=R2/(R2+0.414*Do); break; case '3': /* Band-pass. */ if(R2Do2) H=(float)0.0; else H=(float)1.0; break; case '4': /* Band-reject. */ if(R2Do2) H=(float)1.0; else H=(float)0.0; break; } jj=j
  9. /* Generate Look-up table for bit reversal. */ bit_reversal(L,m,M1); /* Allocating memory for twiddle factors. */ n2=M1-1; wr=(float *)malloc(n2*sizeof(float)); wi=(float *)malloc(n2*sizeof(float)); /* Generating twiddle factor.*/ WTS(wr,wi,M1,1); clrscr(); FFT2D(fptri,fptro,wr,wi,L,M1,m,1); clrscr(); fptri=fopen("IFFT.DAT","rb"); fptro=fopen("temp.dat","wb+"); nsq=(float)(M1*M1); buffo=(float *)malloc(M1*sizeof(float)); for(i=0;i
  10. for(i=M2;i
nguon tai.lieu . vn