Xem mẫu
- 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
2n 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
- 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 :
4n với |n| N 1
2n
(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
- 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
- #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
- 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
- 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
- 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
- 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
- /* 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
- for(i=M2;i
nguon tai.lieu . vn