Xử lý ảnh
Trang 1Chơng 6
Biến đổi Fourier rời rạc
1 ) (
2 1 2
(
k k j
e k k h
) (
2 1 2
1
1 2
2 2 1 1
) , ( )
,
k
N k
k k j
e k k h
H ω ω ω ω (6.2)
Công thức này chứng tỏ rằngH( ω ω1, 2)là tuần hoàn, chu kỳ tuần hoàn là 2π Nếu chúng
ta lấy mẫu dới dạng ω1, ω2, và miền xác định là (0 ≤ω1≤ 2π) và (0 ≤ ω2≤ 2π), N ì N mẫu,
0 1 22
1
1
2 2 1 2
) , ( )
,
k
k n k N j N
k
e k k h n
n
Biểu thức (6.4) đợc gọi là biến đổi Fourier rời rạc 2-D hay còn gọi là DFT Công thức này
đ-ợc áp dụng vào nhiều ứng dụng nh lọc, nén ảnh, phóng đại ảnh Trong chơng này chúng ta sẽ nghiên cứu 2-D DFT và các kỹ thuật tính toán Đầu tiên, chúng ta sẽ xem xét 1-D DFT, sau
đó mở rộng ra cho 2-D
6.2 Biến đổi Fourier 1-D
Biến đổi Fourier 1-D cho tín hiệu thời gian rời rạc f(kT) tính theo công thức :
Trang 2nk N j
e kT f n
(
N n
nk N
W k f n
1 )
n
nk N
j
e n F N k f
1 0
) (
1 0
1 0
1 0
) ( 1
) (
1 )
( 1
kn N N
n
N
m
nm N N
n
nk N
W m f N
W W m f N
W n F N
N n
m k n N
W S
)) ( 2 (
m) - (k N
m) - N(k N
1 1
W - 1
W - 1
m k N j
m k j
e e S
Khi e j2π(k-m) = 1 vµ e j2π/N (k-m) ≠ 1 víi (k ≠ m), v× vËy S = 0 víi (k ≠ m )
V× vËy, biÓu thøc (6 9) cã thÓ rót gän thµnh
Trang 3f(k).N
1 )
Kết quả này giống nh biểu thức (6.8)
Khi f(k) có thể rút ra từ F(n) và ngợc lại, chúng gọi là cặp biến đổi Cặp biến đổi này có dạng
f ( k ) ⇔ F ( n )
Chú ý từ biểu thức (6.8) ta có thể dễ dàng chứng minh:
) (
) ( 1
) ( 1
1 0
2
1 0
) ( 2
k f
e n F N
e n F N
N
n
nk N j
N
n
N k n N j
6.2.2 Một vài tính chất của DFT
k
nk N j N
k
N N j
N
k
n N k N
e e k f
e e k f
W k f n
N F
2 1
0
2 1
0
2
1 0
) (
) (
) (
) ( )
Trang 4n F e
k f n
N
k
nk N
j π
(6.13)
DÊu * cã nghÜa lµ liªn hîp phøc
Fourier rêi r¹c lµ F1 (n) vµ F 2 (n) Xem xÐt tÝch F(n 1 ).F(n 2 )
khi ( ) 1 ( )
1 1
1
1 1
W k f n
)
( )
2 2
2
2 2
W k f n
) (
1 0 2 2 1
0 1 1
1 0
1 0
1 0
) ( 2 2 1 1
2 1 2
1
1 2
2 1
1 ) ( )
(
) ( ) ( 1
N n
k k k n N N
k
N k
nk N N
n
N k
N k
k k n N 3
W N k f k f
W W
k f k f N
(k) f
k k k n
W N
ë ®©y l lµ sè nguyªn V× vËy mµ
) (
) ( )
0 1 1 1
=
.
=
2 n -
N 21
1 1
2
2 2 1
1 1
0
2 2 1 1 1 0
1 0 1 2 1
0 1 1 1
1 1 1
) ( ) (
) ( )
( )
( ).
(
k N
k
k N N
n
N
k
k n N N
k
k N
W k f k f
W k f W
k f n
F n F
Trang 5ở đây k = 0 đến 2N - 1
Biểu thức trên biểu diễn tích chập của hai tín hiệu tuần hoàn Chú ý rằng biêủ thức này chỉ
áp dụng cho hai d y có chung một chu kỳ, và chiều dài của d y tính theo biểu thức trên là ã ã 2N -
1 Kết quả này chứng minh rằng trong DFT, tín hiệu có số mẫu lớn hơn N sẽ đợc biến đổi
thành d y tuần hoàn có chu kỳ ã N Khi dùng DFT cho một tín hiệu không có chu kỳ, mà kết quả
thu đợc từ tích hai d y, ta sẽ phạm một sai lầm gọi là lỗi ã wraparound Đó là lý do ta phải làm
cho cả hai d y có chu kỳ bằng nhau Để sửa lỗi này, một số số 0 cần phải thêm vào cả hai d y đểã ãchiều dài hai d y bằng nhau Ví dụ, nếu một d y có chiều dài ã ã A, một d y có chiều dài ã B, kết quả
ta phải thêm các số 0 cho cả hai d y có chiều dài ít nhất là ã A + B - 1.
1 ) (
1 ) (
f
1 Tính bằng tay tích chập của hai d y trên Vẽ một lã u đồ biểu diễn thuật toán
2 Làm lại phần 1, nhng lần này sử dụng tích chập tuần hoàn
3 Lập một chơng trình C rút ra f3 (k) từ biểu thức f 3 (k) = IDFT{DFT[f1 (k)] DFT[f 1 (k)]} So sánh kết quả của phần 1 và phần hai
4 Bây giờ thêm các số không vào f1 (k) và f 2 (k) để chu kỳ của chúng = 5 + 6 - 1 Làm lại
phần 3 và so sánh kết quả
6.3 Thuật toán biến đổi nhanh Fourier
Tính trực tiếp giá trị của DFT bao gồm N phép nhân phức và N - 1 phép cộng phức cho mỗi giá trị của F(n) Khi N giá trị đợc tính toán thì N2 phép nhân và N(N - 1) phép cộng đợc tính toán Cũng nh vậy, cho N có giá trị rất lớn, tính trực tiếp giá trị của DFT sẽ đòi hỏi một số phép tính lớn đến mức không thể chấp nhận đợc Để ví dụ, cho N = 1024 = 210 ta sẽ phải tính
220 = 1,048,576 phép nhân số phức và một số gần bằng nh vậy các phép cộng
Hoàn thiện có nghĩa là phải giảm số phép tính trong biến đổi Fourier xuống Dới đây chúng
ta sẽ giới thiệu hai thuật toán hay dùng là thuật toán phân chia thời gian và thuật toán phân chia tần số DFT dùng các thuật toán trên gọi là Fast Fourier transform (FFT)
6.3.1 Thuật toán phân chia thời gian
Xem xét tính toán của DFT cho bởi (5.6) với N= 2r (r là một số nguyên bất kỳ) Cơ sở của thuật toán phân chia thời gian thì rõ ràng Tuy nhiên, việc thiết kế phần mềm cũng đòi hỏi một số phân tích chi tiết Để làm rõ các bớc của thuật toán này chúng ta sẽ bắt đầu phân tích với N = 16 và sau đó mở rộng ra áp dụng cho N bất kỳ
Cơ sở của thuật toán phân chia thời gian dựa trên cơ sở chiến lợc chia và chiếm Các bớc sau sẽ làm sáng tỏ thuật toán Vì trong trờng hợp này N =16; nên,
0 ≤ k1 ≤4các trờng hợp còn lại
0 ≤ k1 ≤ 5các trờng hợp còn lại
Trang 6k
nk
W k f n
0
) ( )
(
k
nk k
nk f k W W
k f n
0
) 2 (
) 2 ( )
(
k
k n k
k
W k f n
n j k
n
W
e e
2 )
2 ( 16
2 )
2 ( 16
π π
) 1 2 ( )
2 ( )
(
k
nk n
k
W k f n
7 0
8
) (
k
nk n
k
W k f n
k
nk
W k f n
k
nk
W k f n
Trang 7(n) F W - (n) F 8)
Biểu thức (6.19) và (6.20) định dạng những đơn vị tính toán gọi là bớm Hình 6.1 là biểu đồ của phần tử bớm Ký hiệu W16 -n thờng gọi là trọng lợng hay hệ số xoay Hai biểu thức này biểu diễn bớc cuối cùng trong lu đồ tính toán của hình 6.2
Bây giờ xem xét biểu thức
k
nk
W k f n
k
nk n
k
W k f n
(2k) f (k) f
10 21
10 20
Trang 8Hình 6.2 Bớc cuối cùng của thuật toán biến đổi FFT phân chia miền thời gian X(k)
ký hiệu vector chứa giá trị đợc tính qua phép biến đổi FFT
2 16 4
20
k
nk k
n
W k f n
F
(n) F W (n) F (n)
(n) F W - (n) F 4) (n
Tơng tự
F11(n) = F22(n) + W16 -2nF23(n) (6.25)
(n) F W - (n) F 4)
(n
F
16 22
0123456701234567
0123456789101112131415
F10(n)
F(n)
F11(n)
X(k)X(k)
Trang 922( ) ( )
k
nk
W k f n
k
nk
W k f n
(n) F W - (n) F 2) (n
(n) F W - (n) F 2) (n
(n) F W (n) F (n)
(n) F W - (n) F 2) (n
F23(n) = F36(n) + W16 -4nF37(n) (6.35)
(n) F W - (n) F 2) (n
Trang 10Hình 6.3 Bớc thứ hai sau bớc cuối cùng trong thuật toán FFT.
Hình 6.4 Bớc đầu tiên của lu đồ FFT.
F22(n)
0
F23(n)
426
000000
00
010101010101010101
Trang 11Hình 6.5 giới thiệu sơ đồ thuật toán FFT cho N = 16 Chú ý rằng do yêu cầu ban đầu của chơng trình mà d y vào đã ợc sắp xếp lại và chứa ở X(k), ví dụ
X(k) = x(q) k = 0 đến 15
Bạn sẽ chú ý trên sơ đồ rằng q là giá trị bit của k
Cho N = 24 = 16 chúng ta phải có bốn bớc trong lu đồ Trong mỗi bớc cần phải có tám bớm Trong mỗi bớm chỉ có một phép nhân phức, hai phép cộng hoặc trừ phức Tổng số phép nhân phức là 8/2 4 Tổng quát cho N = 2r số phép nhân phức là (N/2) r = (N/2 ) log2 N và số phép
cộng là Nlog2 N Chú ý, thực tế số phép nhân sẽ giảm xuống một ít, vì trong bớc đầu tiên hệ số
xoay W0 = 1 và trong các bớc còn lại chúng ta cũng có các bớm với hệ số xoay = 1
Xem xét trờng hợp N = 1024 = 210 Số phép nhân cần dùng cho FFT là (N/2).10 = 1024 ì 5
= 5120 so với 1 triệu phép nhân cho tính trực tiếp biến đổi DFT, đây là phơng pháp tiết kiệm thực sự cho tính toán
Bây giờ, chúng ta sẽ vạch ra thuật toán FFT Đó không đơn thuần chỉ là sự phát triển một chơng trình từ lu đồ Tuy nhiên, chúng ta có thể nghiên cứu lu đồ và vạch ra các bớc có thể dùng để phát triển một chơng trình Từ lu đồ của hình 6.5 chúng ta có thể viết:
Bớc thứ nhất Trong bớc này ta có tám bớm với trọng lợng (hệ số xoay) W0 = 1 Chúng ta có thể viết (xem hình 6.6)
Trang 120 2 4 6
0 2 4 6
0 4
0 4
0 4
0 4
0 4 8 12 2 6 12 14 1 5 9 13 3 7 11 15
0 2 4 6 8 10 12 14 1 3 5 7 9 11 13 15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Trang 1310 k f
) (
11 k f
(b)
Trang 14
8 Một bớm với trọng lợng bằng W(6) = W7
T = X(7)W(6)
X(7+8)= X(7)-T
X(7) = X(7) +T
Các bớc dẫn chúng ta đến thuật toán với N = 16
Thuật toán
ip=1
kk=8
incr=2
cho iter=0 đến 3 trong các bớc của 1
{
cho j=0 đến 15 trong các bớc của incr
{
i = j + ip T = X(j) X(i) = X(j) - T X(j) = X(j) +T nếu (iter không bằng 0) thì {
cho k=1 đến ip-1 trong các bớc của 1 {
r = k*kk - 1 cho j=k đến 15 trong các bớc của 15 {
i=j+ip T=X(i)*W(r) X(i)=X(j)-1 X(j)=X(j)+T
}
}
}
kk=kk/2 ip= ip*2 inc=inc*2 }
Thuật toán trên có thể dễ dàng mở rộng cho tất cả các trờng hợp của N Chỉ có một lĩnh vực còn lại cần phải giải thích là sự sắp xếp lại các d y dữ liệu đầu vào Điều này có thể tạo ra dễã dàng nếu chúng ta tạo ra một bảng (LUT) L(i), L(i) là các giá trị đảo ngợc bit của i Nếu dữ liệu đợc đọc từ một file thì tất cả các việc mà chúng ta phải làm là chuyển địa chỉ vùng của chúng trong file qua bảng LUT và lu các dữ liệu này trong địa chỉ chứa kết quả trong d y đầu vào, X.ã Bớc này có thể chuyển sang ngôn ngữ C nh sau: for (i=0; i<N; i++) fscanf (fptr, “ %f ”, &X[L[i]]);
Trang 15Kết quả của LUT đợc chuyển thẳng và đợc cung cấp với chơng trình của thuật toán tính FFT trong Listing 6.1 dới dạng modun con dới tên “ bit_reversal( )”.
Chơng trình 6.1 “FFTDT.C” FFT 1-D Thập phân trong miền thời gian.
/* FFT - Decimation-in-time routine with examplemain
programing proper usage */
void bit_reversal(unsigned int *, int , int);
void WTS(float *, float *, int, int);
void FFT(float *xr, float *xi, float *, float *,
Trang 16/* Allocating memory for bit reversal LUT */
L=(unsigned int *)malloc(N*sizeof(unsigned int));
/* Generate Look-up table for bit reversal */
void bit_reversal(unsigned int *L, int m, int N)
/* Routine for generating LUT for bit reversal
Note: N=(2 to the power of m)
LUT will reside in LI]*/
Trang 17void WTS(float *wr, float *wi, int N, int sign)
/* Generating LUT for twiddle factors
Note:
sign=-1 for FFT, and
sign=1 for IFFT */
You will need to use routine "bitreversal" for that purpose
3 The twiddle factors are assumed to be stored in LUT's wr[I and wi[j You will
need to use routine LUT for calculating and storing twiddle factors.*/int ip,k,kk,l,incr,iter,j,i;
Trang 18
Bài tập 6.2 Kiểm tra chơng trình FFT bằng cách làm lại chơng trình 6.1 Chú ý rằng trong
trờng hợp này bạn phải thêm các giá trị 0 để làm cho các d y có chiều dài 2ã 4 = 16 và tất nhiên
là lớn hơn chiều dài d y nhỏ nhất đòi hỏi là (6 + 5 - 1) Mối tã ơng quan của hai d y cho kết quảãtrong một tín hiệu tuần hoàn có chu kỳ bằng 16
6.3.2 Thuật toán phân chia tần số.
Thay vì chia d y vào thành các vị trí chẵn và lẻ, chúng ta sẽ đã a ra một chơng trình giống
nh chơng trình trên nhng lần này ta bắt đầu từ d y ra Chã ơng trình này bao gồm các bớc sau:
Trang 19kn N N
k
nN
N
N k
kn N N
k
kn N
W
N k f W k f
W k f W
k f n
2 /
1 2 /
1 2 / 0
) 2 ( )
(
) ( )
( )
( [ )
2
0
kn N N
n N
k
W
N k f W
k f n
=
+ +
( [ )
1 2
0
+
− +
−
−
=
+ +
=
N N
n N
k
W
N k f W
k f n
) 1 2 ( 2 / ).
1 2
2
0
kn N N
k
W
N k f k f n
=
+ +
] )
2 ( ) ( [ )
1 2
0
kn N
k N N
k
W W
N k f k f n
W k f n
Trang 20
.) ( )
1 2
0
N k
W k f n
=
∑
= +
(6.40)
Các biểu thức (6.39) và (6.40) có thể biểu diễn bằng dới dạng biểu đồ bớm nh trong hình 6.6.Chúng ta có thể tiếp tục chia nhỏ các tổng cho trong các biểu thức (6.39) và (6.40), tiếp tục làm nh vậy cho tới khi mỗi tổng giảm xuống chỉ còn lại một phần tử Giải thuật này giống nh giải thuật thuật toán phân chia thời gian và để lại cho bạn nh một bài tập cho bạn Một lu đồ cho FFT phân chia tần số với N = 4 trình bày trong hình 6.7 Bạn cần chú ý đến bậc của dữ liệu đầu ra là bit đợc đảo Phần mềm thực hiện thuật toán trên thì rất giống phần mềm thực hiện FFT phân chia miền thời gian, và một chơng trình C đợc cung cấp ở Chơng trình 6.2
Có lẽ bạn sẽ tự hỏi: nếu phân chia miền thời gian đ thực hiện đã ợc công việc thì tại sao lại phải xem xét thêm FFT phân chia tần số Để trả lời câu hỏi này, chúng ta sẽ cần xem xét phần
void bit_reversal (unsigned int *, int, int);
void WTS(float *, float *, int, int) ;
void FFT(float *xr, float *xi , float, float, int, int);
2 The output arrays are left in bit-reverse
order You will need to use routine "bit-reversal" to place them in normal ascending order
3 The twiddle factors are assumed to be stored in LUT's wr[j and wiEj You will need to use routine LUT for calculating and storing twiddle factors */
int ip,k,kk,l,incr,iter,j,i;
float Tr,Ti,diffr,diffi;
Trang 210 2 4 6
0 2 4 6
0 4
0 4
0 4
0 4
0 0 0 0 0 0 0
0
0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15
0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15
0 4 8 12 2 6 12 14 1 5 9 13 3 7 11 15
0 2 4 6 8 10 12 14 1 3 5 7 9 11 13 15
Trang 22Thuật toán giảm lợc đầu vào FFT Trờng hợp này sẽ làm hoàn thiện hơn thuật toán
phân chia tần số Hình 6.8 giới thiệu trờng hợp M = 1 và L = 4 Từ hình 6.8 chúng ta nhận thấy (L-M) bớc đầu tiên có các phần tử bớm và L bớc cuối cùng có toàn bộ các bớm Sơ đồ này giúp chúng ta thay đổi chơng trình 6.2 thành chơng trình 6.3
Chơng trình 6.3 "FFTIP.C" Giảm lợc đầu vào FFT
/* FFT - input pruning routine */
void bit_reversal(unsigned int *, int , int);
void WTS(float *, float *, int, int);
void FFTP(float *xr, float *xi, float *, float *, int,int,int, int);void FFTP(float *xr, float *xi, float *wr, float *wi,
int m_output, int N_output,
int m_input, int N_input )
{
Trang 23/* FFT pruning algorithm
Deimation-in-frequency algorithm
Note:
1 Noutput=2 to the power of m_output
N_output=Number of samples in the output sequence
M_input=Number of samples in the input sequence This should also
be a multiple of 2
2 The output arrays are left in bit-reverse order
You will need to use routine "bit-reversal" to place them in normal ascending order
3 The twiddle factors are assumed to be stored in LUT's wr[I and wi[I You will need to use routine LUT for calculating and storing twiddle factors */
int ip,k,kk,l,inc r,iter,j,i;
0481226101415913371115
0841221061419513311715
0841221061419513311715
Trang 24Hình 6.8 Lu đồ thuật toán giảm lợc đầu vào, N=4
Trang 25Tính 1024 điểm trong phổ tần số dùng chơng trình giảm lợc đầu vào FFT.
2 Thêm các giá trị 0 vào d y để làm cho chiều dài d y thành 1024 Bây giờ tính FFT scủaã ã
d y dùng chã ơng trình FFT phân chia tần số không giảm lợc So sánh thời gian xử lý của phần 1 và 2
Thuật toán FFT giảm lợc đầu ra Giải thuật phân chia miền thời gian thì thích hợp
cho thuật toán giảm lợc đầu ra hơn là giải thuật phân chia miền tần số Lý do là đầu ra trong giải thuật phân chia miền thời gian không phải sắp xếp lại Hình 6.9 giới thiệu trờng hợp với
M=4 và L=1.
Hình 6.9 Lu đồ cho giảm lợc đầu ra FFT, N = 4.
Chơng trình 6.4 “FFTOP.C” Giảm lợc đầu ra FFT.
0481226101415913371115
0841221061419513311715
Wn=0 đến 3
Wn=0 đến 1W
n=0
Trang 26/* FFT - output pruning using Decimation-in-time routine */
# define pi 3.141592654
void bit_reversal(unsigned int *, int , int);
void WTS(float *, float *, int, int);
void FFTP(float *xr, float *xi, float *, float *,int, int, int, int);void FFTP(float *xr, float *xi, float *wr, float *wi,
int m, int N, int m_output, int N_output){
/* FFT output pruning algorithm using
Decimation-in-time
Note :
1 N=number of input samples
=2 to the power m
N-output = number of output samples =2 to the power motput
2 The input arrays are assumed to be rearranged in bit-reverse order
You will need to use routine "bit-reversal" for that purpose
3 The twiddle factors are assumed to be stored in LUT's wr[] and wi[] You will need to use routine LUT for calculating and storing twiddle factors.*/