Tải bản đầy đủ (.doc) (38 trang)

Xử lý ảnh - Chương 11

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (799.35 KB, 38 trang )

Chơng
9
Bộ lọc có đáp ứng xung vô
hạn hai chiều
9.1 Chỉ dẫn
Trong các chơng trớc, chúng ta đ nghiên cứu lọc ảnh bằng các bộ lọc FIR. Chúng taã
cũng đ lọc ảnh trực tiếp từ miền tần số thông qua FFT. Hình nhã là không có một vấn đề
nào rõ ràng với các bộ lọc kiểu FIR khiến chúng ta quan tâm đến các kiểu khác của hàm
truyền đạt. Tuy vậy, rõ ràng lọc FIR là một xấp xỉ đối với đáp ứng xung vô hạn của hệ
thống LSI bằng cách cắt giảm bớt. Các hệ thống với miền chuyển tiếp dần dần có thể xấp
xỉ hoá bằng bộ lọc FIR bậc thấp. Nhng dù thế nào đi chăng nữa, thì hệ thống có miền
chuyển đổi dốc cũng đòi hỏi các bộ lọc FIR bậc cao. Đấy là do sự hội tụ chậm của chuỗi
Fourier. Biểu thức của chuỗi Fourier biểu diễn cho hệ số của bộ lọc FIR. Bằng cách cắt bớt
chuỗi này, nhằm sử dụng các bộ lọc FIR bậc thấp đ dẫn đến các dao động Gibbs, đ đã ã ợc cho
ở trong chơng 8. Mặc dù các hàm cửa sổ có thể giảm thiểu các dao động này, nhng rút cục
là một bộ lọc có miền chuyển tiếp dốc hơn và các nhiễu gợn nhỏ hơn. Vì vậy, chúng ta chỉ có
một lựa chọn duy nhất là sử dụng các bộ lọc bậc cao để rút ra các miền chuyển tiếp dốc,
nếu chúng ta kiên trì với các bộ lọc FIR. Điều này cũng có nghĩa là thời gian tính toán cho
một ảnh lọc cũng nhiều hơn. Nếu chúng ta cần một bộ lọc với thời gian thực thì phần cứng
cần phải đợc đợc cung cấp đi kèm, và các bậc cao hơn thì đẫn đến kết quả giá cả cao hơn.
Nh một sự lựa chọn, chúng ta sẽ bắt đầu với hàm chuyển đổi mà có đáp ứng xung vô
hạn. Tất cả các hàm chuyển đổi này đợc biết dới cái tên bộ lọc có đáp ứng xung vô hạn
(Infinite-Impulse-Response filter) hay là gọi là bộ lọc IIR. Các kiểu bộ lọc sẽ đạt đợc dải
chuyển đổi dốc với bậc nhỏ hơn kiểu lọc FIR. Nếu nh vậy, chắc bạn sẽ tự hỏi là tại sao
chúng ta không bỏ lọc FIR đi mà sử dụng lọc IIR? Nguyên nhân là thiết kế và phần cứng
bộ lọc FIR đ có sẵn, còn thiết kế cho bộ lọc IIR vẫn chã a có. Ví dụ, nếu bộ lọc IIR có đáp ứng
xung vô hạn, thì chúng có xu hớng ngày càng không ổn định. Vì vậy, đáp ứng xung có thể
tăng lên rất lớn nếu ta không có một sự cẩn thận trong thiết kế. Pha tuyến tính, một yêu
cầu cần thiết trong lọc ảnh, có thể đạt đợc dễ dàng từ lọc FIR hơn là từ lọc IIR. Tuy nhiên,
sự thuận lợi cung cấp bởi các hàm chuyển đổi IIR khiến cho chúng có đủ sức thu hút chúng
ta quan tâm đến vấ đề này. Trong chơng này chúng ta sẽ xem một số giả thiết đơn giản cho


thiết kế bộ lọc IIR với đặc tuyến pha gần tuyến tính.
9.2 Bộ lọc IIR
Hàm truyền đạt của bộ lọc cho bởi :
162


= =


= =


=
N
i
N
j
j
i
ij
N
i
N
j
j
i
ij
zzb
zza
zzH

0 0
2
1
0 0
2
1
21
),(
(9.1)
Không mất tính tổng quát, b
00
đặt bằng 1.
Nếu y(m,n) và x(m,n) là d y tín hiệu ra và vào, từ biểu thức (4.93) ta có thể viết ã

),(),(),(
0 0
0
0 0
jnimxbjnimxanmy
ij
N
i
N
j
ji
N
i
N
j
ij

=

= =
+
= =
(9.2)
Để bộ lọc thực hiện đợc và ổn định đáp ứng xung h(m,n) phải có những hạn chế sau
h m n( , ) = 0 (m < 0) (n < 0)
(9.3)


=

=
<
0 0
),(
m n
nmh
(9.4)
Biểu thức (9.4) dẫn đến kết luận khi xem xét kỹ thuật thiết kế cho các bộ lọc IIR là
phơng pháp dùng đáp ứng không gian thuận tiện hơn phơng pháp dùng đáp ứng tần số.
Nếu nh phơng pháp đáp ứng không gian không hiệu quả khi m, n tăng, thì thiết kế một bộ
lọc xấp xỉ nhng ổn định là cần thiết. Vậy thì bộ lọc đó phải thoả m n điều kiện cho bởi côngã
thức (9.4). Bởi vì đáp ứng không gian và đáp ứng tần số liên hệ với nhau qua chuyển đổi
Fourier, Ta có thể rút ra kết luận là bộ lọc xấp xỉ với đáp ứng xung là tơng đơng với bộ lọc
xấp xỉ với đáp ứng tần số tơng ứng. Điều này nói chung là đúng. Tuy nhiên, nh chúng ta đã
thấy thiết kế của bộ lọc FIR, cái đặc trng cơ bản nhất là phổ biên độ với điểm pha không.
Câu hỏi sẽ là, với đặc điểm pha nào (
1

,
2
) thì bộ lọc ổn định? Biết rằng chúng ta cần pha
tuyến tính hoặc các hằng số trễ, ở đây các nhóm trễ đợc định nghĩa là

2
21
212
1
21
211
),(
),(
),(
),(








=


=
(9.5)
công việc là lựa chọn ra các hằng số trễ. Trong phần tiếp theo chúng ta sẽ nghiên cứu một
phơng pháp phổ biến để thiết kế bộ lọc, tiếp đó là các thay đổi cần thiết bao gồm cả các

điểm pha tuyến tính.
9.3 Phơng pháp Shanks
Đây là một trong những phơng pháp đầu tiên đợc dùng trong thiết kế không gian bộ lọc
IIR. Mặc dù đây là một phơng pháp tiếp cận trong miền không gian nhng chúng ta sẽ bắt
đầu xem xét phơng pháp này trong miền tần số, sau đó nội suy sang miền không gian. Lý
do của cách làm này đợc thể hiện qua một loạt các biểu thức. Đáp ứng tần số của các bộ lọc
IIR đợc mô tả ở bằng biểu thức (4.93) có thể rút ra bằng cách đặt

1
1
j
ez

=
, và

2
2
j
ez

=
. Vì vậy,
163
H
A
B
( , )
( , )
( , )




1 2
1 2
1 2
=
(9.6)
ở đây

= =

=
N
l
N
k
jj
lk
eeaA
0 0
21
21
),(


(9.7)


= =


=
N
l
N
k
jj
lk
eebB
0 0
21
21
),(


(9.8)
Nếu
H
d
( , )

1 2
là phổ tần số mong muốn thì

),(
),(
),(),(
21
21
2121




B
A
H
d
=
(9.9)
Chuyển biểu thức (4.99) sang miền không gian ta có

),(),(),( nmhnmhnm
d
=

(9.10)
ở đây h(m,n) là đáp ứng xung của bộ lọc và có thể rút ra từ


= == =
+
=
N
i
N
j
ij
N
i
N

j
ij
ji
jnimhbjnimanmh
0 00 0
0)(
),(),(),(

(9.11)
Các hệ số {a
mn
} và {b
mn
} cha đợc xác định.
Xây dựng theo chuẩn L
2


= =
=
M
m
M
n
nmQ
0 0
2
),(

(9.12)

ở đây M
ì
M là số các mẫu đợc cung cấp từ đáp ứng xung.
Để rút ra các hệ số của bộ lọc ta cần tối thiểu hoá Q. Điều này đạt đợc nếu ta đạo hàm
Q theo các hệ số của bộ lọc và cho kết quả sau khi đạo hàm bằng 0.


= =
=
M
m
M
n
lklk
a
nm
nm
a
Q
0 0
),(
),(2





(9.13)
l, k = 0, 1, ..., N



= =
=
M
m
lk
M
n
lk
b
nm
nm
b
Q
0 0
),(
),(2





(9.14)
l, k = 0, 1, ..., N l + k 0.
Biểu thức (9.13) tạo ra (N + 1) ì (N + 1) phơng trình phi tuyến với {a
ij
} và {b
ij
}. Biểu thức
(9.14) tạo ra (N + 1) ì (N + 1) - 1 phơng trình phi tuyến với {a

ij
} và {b
ij
}. Bởi vì số các hệ số
của bộ lọc là 2(N + 1) ì (N + 1) - 1, nên từ các phơng trình này ta có thể tìm ra các hệ số và
tìm đợc bộ lọc yêu cầu.
Để tránh phải tính toán một loạt các phơng trình phi tuyến mô tả ở trên, Shanks và
một số ngời đa ra phơng pháp cho phép tối thiểu hoá một hàm lỗi đợc biến đổi. Mặc dù ph-
164
ơng pháp này đợc xây dựng bởi Shanks, Treitel, Justice, nó vẫn đợc biết đến dới tên là ph-
ơng pháp Shanks. Nhân biểu thức (4.99) với B(
1
,
2
) chúng ta rút ra

),(),(),(),(),(
2121212121

AHBB
d
=
(9.15)
Thay thế sai số tải trọng

( , ) ( , )
1 2 1 2
B
bằng
),(

21


trong biểu thức (9.15)
và chuyển kết quả sang miền không gian ta đợc.


= = = =
=

N
i
N
j
N
i
N
j
ij
d
ij
jnimajnimhbnm
0 0 0 0
),(),(),(

(9.16)
Cần nhắc lại là phép nhân trong miền tần số thì tơng đơng với tích chập trong miền
không gian. Bây giờ ta xây dựng theo chuẩn L
2


= =

=
M
m
M
n
nmQ
0 0
2
),(

(9.17)
Đ rõ ràng trong bã ớc này lý do tại sao chúng ta bắt đầu định nghĩa của sai số trong miền
tần số sau đó chuyển kết quả sang miền không gian. Biểu thức (9.17) cho ta giá trị tối
thiểu thực sự của L
2
dới dạng sai số tải trọng, và không phải sai số thực sự.
Để tối thiểu hoá Q ta đạo hàm biểu thức này theo các hệ số của bộ lọc và cho kết quả
bằng 0.

= = = = = =









=
M
m
M
n
N
i
N
j
N
i
N
j
d
ijij
lk
jnimhbjnima
a
Q
0 0 0 0 0 0
),(),(2




( , ) , , , ,...,m l n k l k N = =0 0 1 2
(9.18)
Từ phơng trình (9.18) ta có thể viết

Rnm

jnimhba
N
i
N
j
d
ijmn

=

= =
,
),(
0 0
(9.19)
ở đây R là miền không gạch chéo ở hình (9.14). Bởi vậy, biểu thức (9.17) có thể đợc viết lại
dới dạng
,
),(
2
0 0
Rnm
jnimhbQ
m n
N
i
N
j
d
ij








=

= =
(9.20)
Tối thiểu Q ta đạo hàm biểu thức và cho nó bằng không

Rnm
knlmhjnimhb
b
Q
m n
d
N
i
N
j
d
ij
lk

=









=

= =
,
0),(),(2
0 0


(9.21)
165


0 ,...,2,1,0, .,
),(),(-
),(),(
m n
0 0
+=

=


= =
klNklRnm

knlmhnmh
knlmhjnimhb
dd
m n
dd
N
i
N
j
ij
(9.22)
Phơng trình (9.22) tạo ra (N + 1) ì (N + 1) - 1 các phơng trình tuyến tính có thể giải ra
đợc để tính các hệ số của bộ lọc.
Hình 9.1 Miền R cho biểu thức (4.19).
9.4 Tính đáp ứng xung
Thuật toán chúng ta dùng để tính đáp ứng xung sẽ cũng tơng tự nh các bớc ta dùng
trong tính toán với các hệ số của bộ lọc FIR. Thuật toán này theo các bớc sau :
1. Rút ra M
ì
M điểm của phổ biên độ mong muốn, H
d
(m,n), với điểm tần số (0,0) nằm
tại trung tâm của mảng, cụ thể tại (M/2, M/2). M nên là bội số của 2, H
d
(m,n) nên đối
xứng một cách chặt chẽ.
2. Rút ra IFFT của H
d
(m,n)(-1)
(m+n)

, bằng cách

thừa nhận phổ pha không.
3. Nhân kết quả thu đợc với (-1)
(m+n)
. Điều này sẽ giúp thu đợc đáp ứng xung với gốc toạ
độ nằm tại (M/2, M/2).




2
21
),(
),(
414.01
1
21






+
=
c
R
H
(9.23)

ở đây
2
2
2
121
),(

+=R
, và tần số cắt là
c
= 1.0 rad/đơn vị. n đặc trng cho bậc của
hàm Butterworth. Các bộ lọc có bậc càng cao, miền chuyển tiếp càng dốc, n không phải là
166
(0,0)
m
n
(M,M)
(N,N)
R
bậc của bộ lọc 2-D. Bậc của bộ lọc 2-D sẽ đợc chọn khi thiết kế bộ lọc. Trong ví dụ này thì n
đợc chọn bằng 2. Đáp ứng trong miền không gian đợc cho ở hình 9.2.
Chơng trình dùng để tính đáp ứng xung từ đáp ứng tần số đợc cho ở chơng trình 9.1.
Trong chơng trình này chúng tôi cho cung cấp một số tuỳ chọn nh lựa chọn giữa lọc thông
thấp và thông cao, lựa chọn dùng các hàm Butterworth hay là kiểu có miền chuyển tiếp
dốc.
Dựa trên các giả thiết ở trên chúng ta có thể đa ra đợc thuật toán thiết kế bộ lọc 2-D
có pha tuyến tính ổn định. Chơng trình cho giải thuật này sẽ trình bày ở phần tiếp theo.
Hình 9.2 Đặc tuyến không gian rút ra từ chơng trình giải thích cho ví dụ của phần nói về
đặc tuyến truyền đạt Butterworth.
Chơng trình 9.1 IMPULSE.C. Sinh đáp ứng xung từ đáp ứng tần số.

/* Program for calculating impulse-response from frequency-
specifications.
Result is stored with the (0,O) point centered at the middle of
the output 2-D array. You can either supply your own data or select
from a set of standard functions. If you supply your own data the
first two values should be the dimensions of the array e.g. 32 x32.
The dimensions of the array should be a power of two. 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
#include <stdio.h>
#include <math.h>
#include <alloc.h>
#include <stdlib.h>
#include <io.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
167
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 N,N1,m,n2,i,j,ii,jj,N2,k,norder,j1,ind,yt;
unsigned int *L;
float *wr,*wi,Do,theta,nsqrt,beta,alpha,sum1,sum2,T;

FILE *fptri,*fptro,*fptr;
float *buffi,*buffo,R2,H,nsq,win,slope,gamal,gamah;
unsigned char file_name[14], ch,ch1,file_name1[14];
clrscr() ;
printf("Freq.- response can be calculated using standard\n");
printf(" functions available to you if your reply to the\n");
printf(" following question is negative.\n");
printf("Is freq. response provided in a file? (y or n)-->");
while(((ch1=getche())!='y')&&(ch1!='n'));
switch(ch1)
{
case 'n':
case 'N':
printf("\nEnter # of points to be generated (e.g. 32x32)-->");
scanf("%d%c%d",&N1,&ch,&N1);
break;
case 'y' :
case 'Y ':
printf("\nEnter name of file storing magnitude response-->");
scanf("%s",file_name1);
fptr=fopen(file_name1,"r");
fscanf(fptr,"%d %d ",&N1,&N1);
}
N=N1>>1;
yt=wherey();
again :
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 again;
}
gotoxy(1,yt);
printf( " ");
ind=access(file_name,0);
while(!ind)
{
gotoxy(1,yt+1);
printf ( " ");
168
gotoxy(1,yt+1);
printf("File exists. Wish to overwrite? (y or n)-->");
while(((ch=tolower(getch()))!='y')&&(ch!='n'));
putch(ch);
switch(ch)
{
case 'y' :
ind=1 ;
break ;
case 'n' :
gotoxy(1,yt+1);
printf ( " ");
printf ( " ");
gotoxy(1,yt);

gotoxy(1,yt);
printf("Enter file name -->");
scanf("%s",file_name);
ind=access(file_name,0);
}
}
fptri=fopen("FFT.DAT","wb+");
fptro=fopen("IFFT.DAT","wb+");
buffi=(float *)malloc((N1<<1)*sizeof(float));
switch(ch1)
{
case 'n' :
case 'N' :
/*Generating data for IFFT. */
printf
("\nEnter cut-off freq. in rad./sec. ( cut-off <= n.)->");
scanf("%f",&Do);
Do=(Do/pi)*(float)N;
printf("Enter choice (1,2,3,4 or 5):\n");
printf(" 1. Low-pass with abrupt transition.\n");
printf(" 2. High-pass with abrupt transition.\n");
printf(" 3. Low-pass Butterworth.\n");
printf(" 4. High-pass Butterworth.\n");
printf(" 5. Homomorphic characteristcs--->");
while(((ch=getche())!='l')&&(ch!='2')
&&(ch!=13)&&(ch!='4')&&(ch!='5'));
if(ch=='5')
{
printf("\nEnter gain at kh«ng freq.-->");
scanf("%f",&gamah);

printf("Enter gain at high frequencies.-->");
scanf("%f",&gamah);
slope=(gamah-gamal)/Do;
}
Do*=Do;
if((ch=='3')||(ch=='4'))
{
printf("\n Enter order of Butterworth-->");
scanf("%d",&norder);
for(i=0;i<norder;i++)
Do*=Do;
}
printf("\n");
169
for(i=0;i<N1;i++)
{
ii=(i-N)*(i-N);
for(j=0;j<N1;j++)
{
R2=(float)((j-N)*(j-N)+ii);
if((ch=='3')||(ch=='4'))
{
for(j1=0;j1<norder;j1++)
R2*=R2;
}
switch(ch)
{
case '1': /* low-pass abrupt transition.*/
if(R2<Do) H=(float)1.0;
else H=(float)0.0;

break;
case '2': /* high-pass abrupt transition*/
if(R2<Do) H=(float)0.0;
else H=(float)1.0;
break;
case '3': /* low-order Butterworth */
H=Do/(Do+0.414*R2);
break;
case '4': /* high-order Butterworth. */
H=R2/(R2+0.414-Do);
break;
case '5': /* homomorphic characteristics. */
if ( R2<Do)
H=slope*sqrt((double)R2)+gamal;
else
H=gamah ;
}
jj=j<<1;
buffi[jj]=H;
buffi[jj+1]=0.0;
}
fwrite(buffi,N1,2*sizeof(float),fptri);
}
break;
case 'y':
case 'Y' :
for(i=0;i<N1;i++)
{
for(j=0;j<N1;j++)
{

fscanf(fptr,"%f ",&H);
jj=j <<1 ;
buffi[jj]=H;
buffi[jj+1]=(float)0.0;
}
fwrite(buffi,N1,2*sizeof(float),fptri);
}
fclose(fptr);
}
rewind(fptri);
m=(int)(log10((double)N1)/log10((double)2));
170
/* Allocating memory for bit reversal LUT. */
L=(unsigned int *)malloc(N1*sizeof(unsigned int));
/* Generate Look-up table for bit reversal. */
bit_reversal(L,m,N1);
/* Allocating memory for twiddle factors. */
n2=N1-1;
wr=(float *)malloc(n2*sizeof(float));
wi=(float *)malloc(n2*sizeof(float));
/* Generating twiddle factor. */
WTS(wr,wi,N1,1);
clrscr() ;
FFT2D(fptri,fptro,wr,wi,L,N1,m,1);
remove("FFT.DAT");
clrscr() ;
fptri=fopen("IFFT.DAT","rb");
fptro=fopen(file_name,"wb+");
nsq=(float)(N1*N1);
buffo=(float *)malloc(N1*sizeof(float));

for(i=0;i<N1;i++)
{
fread(buffi,N1,2*sizeof(float),fptri);
for(j=0;j<N1;j++)
buffo[j]=buffi[2*j]/nsq;
fwrite(buffo,N1,sizeof(float),fptro);
}
fclose(fptri);
remove("IFFT.DAT");
rewind(fptro);
printf("Enter selection of window function:");
printf("\n 1.Rectangular.");
printf("\n 2.Hann.");
printf("\n 3.Hamming.");
printf("\n 4.Blackmann.");
printf("\n 5.Kaiser.");
printf("\nEnter (1,2 ... etc.)-->");
while(((ch=getche())!='I')&&(ch!='2')&&
(ch!='3')&&(ch!='4')&&(ch!='5'));
printf("\n");
if(ch!='1')
{
N2=N1/2 ;
theta=pi/((float)N2*sqrt((double)2.0));
for(i=0;i<N1;i++)
{
ii=(i-N2)*(i-N2);
fread(buffo,N1,sizeof(float),fptro);
for(j=0;j<N1;j++)
{

jj=(j-N2)*(j-N2);
nsq=(float)(ii+jj);
nsqrt=sqrt((double)nsq)/sqrt((double)2.0);
switch(ch)
{
171
case '2':
win=0.5+0.5*cos((double)(theta*nsqrt));
buffo[j]*=win;
break;
case '3' :
win=0.54+0.46*cos((double)(theta*nsqrt));
buffo[j]*=win;
break;
case '4' :
win=0.42+0.5*cos((double)(theta*nsqrt))
+0.08*cos((double)(2.0*theta*nsqrt));
buffo[j]*=win;
break;
case '5':
if((i+j)==0)
{
printf("\n\nEnter a value for alpha (1 to 8)-->");
scanf("%f",&alpha);
alpha/=2.0;
}
beta=nsqrt/(float)N2;
beta*=beta;
beta=alpha*sqrt(fabs((double)(1.0-beta)));
T=alpha;

sum1+=1.0+T*T;
for(k=2;k<11;k++)
{
T=(1.0/(float)k)*alpha*T;
sum1+=T*T;
}
T=beta;
sum2=1.0+T*T;
for(k=2;k<11;k++)
{
T=(1.0/(float)k)*alpha*T;
sum2+=T*T;
}
win=sum2/sum1;
buffo[j]*=win;
break;
}
}
fwrite(buffo,N1,sizeof(float),fptro);
}
}
printf
("\nDo you wish to store data for 3-D plotting? (y or n) -->");
while(((ch=getche())!='y')&&(ch!='n'));
switch(ch)
{
case 'n':
fclose(fptro);
exit(1);
case 'y':

rewind(fptro);
}
printf("\nEnter file name for storing data for 3-D plotting ->");
172
scanf("%s",file_name);
fptri=fopen(file_name,"w");
fprintf(fptri,"%d %d\n",N1,N1);
fprintf(fptri,"%e",(float)0.0);
for(i=0;i<N1;i++)
fprintf(fptri,"%e",(float)i);
for(i=0;i<N1;i++)
{
fprintf(fptri,"\n");
fread(buffo,N1,sizeof(float),fptro);
fprintf(fptri,"%e",(float)i);
for(j=0;j<N1;j++)
fprintf(fptri," %e",buffo[j]);
}
fclose(fptri);
fclose(fptro);
}
9.5 Thiết kế bộ lọc IIR
Hình 9.3 biểu diễn miền không gian của đáp ứng xung. Vòng tròn xẫm màu nằm ở
trung tâm chứa những biên độ lớn nhất của h
d
(m,n). Trong phần tiếp theo này, chúng ta sẽ
nghiên cứu cách sử dụng tốt nhất đáp ứng xung trong thiết kế bộ lọc IIR dùng các phơng
pháp Shanks. Rõ ràng chúng ta có khả năng đợc chọn từ:
1. Dùng bốn góc phần t của đáp ứng xung với điểm (0,0) nằm ở tại trung tâm của miền.
2. Dịch chuyển các trục để (0,0) nằm ở góc cao bên trái. (Hình 9.3a)

3. Tính đáp ứng xung từ góc phần t nằm ở bên phải phía dới. (Hình 9.3a)
4. Dịch chuyển các trục một đoạn đủ lớn để bao khối lớn nhất của đáp ứng xung. (Hình
9.3b).
Đáp ứng xung mong muốn đợc trích ra từ miền gạch chéo trong hình 9.3b. Lựa chọn
đầu tiên yêu cầu chúng ta phải chuyển hàm truyền đạt dới dạng :
Hình 9.3 (a) Chọn một phần t hay góc phần t thứ t. (b) Chọn miền lớn hơn
bao gồm những giá trị trội trong đáp ứng xung.
173
(0,0)
Một phần tư
mặt phẳng .
M
M
offset
offset
m
m
n
n
(a)
n n
offset
(0,0)
m
m
(b)
offset
j
i
ij

N
Nj
N
Ni
j
i
ij
N
Nj
N
Ni
zzb
zza
zzH


==


==


=
2
1
2
1
21
),(
(9.24)

Chú ý rằng nếu bạn nhân biểu thức (9.24)với z
1
N
z
2
N
, chúng ta sẽ chuyển hàm truyền đạt
thành một hệ thống nhân quả. Dù thế nào đi chăng nữa tính không nhân quả có nghĩa là
điều kiện khởi đầu khác 0 và điều này cũng chỉ ra rằng không thể loại trừ tính không nhân
quả bằng một phép toán đơn giản. Nếu chúng ta, nói một cách khác, giả thiết điều kiện
ban đầu là 0, chúng ta quay trở lại hàm truyền đạt (9.1) với kích thớc mới là 2N
ì
2N.
Lựa chọn thứ hai yêu cầu một bộ lọc có bậc nhỏ nhất là
22
MM
ì
. Điều này làm tiêu tan
những mục đích mà chúng ta đặt ra trớc đây khi chọn bộ lọc IIR trớc FIR. Sự cần thiết cho
những bậc cao phát sinh từ thực tế là: đáp ứng xung bắt đầu gần nh từ không và tăng lên
đến cực đại sau trễ của
2
M
mẫu theo cả hai hớng. Nghĩa là một đơn vị mẫu vào cần trải
qua một khoảng thời gian trễ khá lớn.
Lựa chọn thứ ba bắt nguồn từ thực tế rằng nếu nh phổ biên độ đ tính bằng cách dùngã
góc phần t đơn lẻ này, trong trờng hợp đối xứng vòng tròn, nó sẽ cho kết quả của phổ biên
độ nh đ chỉ ra lúc đầu. Tuy nhiên đặc tính pha sẽ không phải là đặc tính pha sẽ chỉ ra lúcã
đầu.
Lựa chọn thứ t, dùng hai tính chất của biến đổi Fourier :

1. Đáp ứng xung giảm đi rất nhanh khi ra xa khỏi trung tâm .
2. Một dịch chuyển trong đáp ứng xung thì tơng đơng với một phép cộng một pha tuyến
tính vào đặc tuyến tần số. Nh chúng tôi đ nhấn mạnh trong các chã ơng trớc, pha
tuyến tính là một mong muốn trong xử lý ảnh.
Nếu chúng ta bắt đầu với trờng hợp pha không, sau đó áp dụng lựa chọn cuối cùng
chúng ta có thể thiết kế bộ lọc với pha gần nh tuyến tính. Chú ý rằng dịch chuyển trong
hình 9.3b tốt nhất là nên đặt là N - 1.
Dùng đặc tuyến tần số cho bộ lọc thông cao với N = 2, và dịch chuyển = 1, ta có thể thiết
kế hàm truyền đạt dùng các giả thiết của Shanks. Độ lớn, góc pha, và đáp ứng xung của bộ
lọc thiết kế cho ở hình 9.4, 9.5 và 9.6. Các hệ số của bộ lọc cho ở bảng 9.1.
Bảng 9.1 Hệ số của bộ lọc
Hệ số a Hệ số b Chỉ số i,j
-0.053251 1.000000 0,0
-0.031599 -0.561535 0,1
-0.019086 0.006960 0,2
-0.031599 -0.561535 1,0
0.978508 0.369372 1,1
-0.576799 0.006188 1,2
-0.019086 0.006960 2,0
-0.576799 0.006188 2,1
0.357313 0.003567 2,2
174
Dễ thấy từ các hình này là bộ lọc có miền chuyển tiếp dốc hơn so với bộ lọc FIR 5 ì 5
cùng thông số. Nó có đặc tuyến pha tuyến tính và ổn định hơn. Để chứng minh là bộ lọc
IIR có miền chuyển tiếp dốc hơn bộ lọc FIR có cùng các hệ số, bạn h y chạy thử chã ơng trình
thiết kế bộ lọc FIR và sau đó so sánh kết quả.
Hình 9.4 Phổ biên độ của bộ lọc 2-D.
Hình 9.5 Phổ pha của bộ lọc IIR 2-D.
175
Hình 9.6 Đáp ứng tần số của bộ lọc IIR.

Chơng trình dùng để thiết kế bộ lọc IIR dùng các giả thiết của Shanks cho ở chơng trình
9.2.
Chơng trình 9.2 "IIRD.C". Thiết kế mạch lọc dùng phơng pháp Shanks.
/* This program is for designing 2-D IIR filters
using Shanks's method. You will need to run IMPULSE.EXE
first. */
#define pi 3.141592654
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <alloc.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
void SIMQ(float *,int);
void main()
{
FILE *fptri,*fptro;
double nsq;
int M,i,j,l,k,m,n,N,N1,N2,kk1,kk2,Nt,M1,NO,MSQ,M2,y,MC,yt,ind;
float *A, **a,**b,*buffi,sum;
float zrt,zit,zrb,zib,mag,*w,winc;
float *h,xrm,xim,xrn,xin,rl,im,theta;
char file_name[14],ch;
clrscr();
176

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×