Biến đổi fourier rời rạc sử dụng trong Xử lý ảnh số
Trang 16 Biến đổi Fourier rời rạc
( 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
0
2 1 2
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ứcnà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àychú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ét1-D DFT, sau đó mở rộng ra cho 2-D
6.2 Biến đổi Fourier 1-D
k
nk N j
e kT f n
n
nk N
W k f n
Trang 2n
nk N
j
e n F N k f
1 0
) (
1 0
1 0
1 0
)(1
)(
1)
(1
N m
N n
m k n N
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
11
W-1
W-1
m k N j
m k j
e e S
Vì vậy, biểu thức (6 9) có thể rút gọn thành
f(k).N
1)
(
0F n W N N
N n
nk
=∑−
=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
Trang 3Chó ý 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
TuyÕn tÝnh NÕu ta cã hai d·y tuÇn hoµn cïng f 1 (n) vµ f 2 (n), vµ c¶ hai d·y nµy tuÇn
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
) (
)(
)(
)()
n F e
k f n
N
k
nk N
j π
(6.13)
DÊu * cã nghÜa lµ liªn hîp phøc
TÝch chËp tuÇn hoµn Coi f 1 (k) vµ f 2 (k) lµ hai d·y tuÇn hoµn cã chu kú N, víi biÕn
)
Trang 4khi ( ) 1 ( )
0 1 1 1
1
1
1 1
W k f n
)
()
0 2 2 2
2
2
2 2
W k f n
3( ) 1 ( ) ( )vì vậy
1
0 2 2 1
0 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
N n
k k k n
W N
)(
)()
Đó 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ố 0cầ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ó
cho k = k 1 + k 2 + lN
các trờng hợp còn lại.
W
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 51)(
2 k f
1 Tính bằng tay tích chập của hai dãy trên Vẽ một lu đồ 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
lại phần 3 và so sánh kết quả
6.3 Thuật toán biến đổi nhanh Fourier
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 đâychú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ậttoá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
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
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
(
k
nk
W k f n
0
16 ( ))
()
(
k
nk k
W k f n
F
k chẵn k lẻ
Chúng có thể viết thành
0 ≤k 1 ≤ 4 các trờng hợp còn lại.
0 ≤k 1 ≤ 5 các trờng hợp còn lại.
Trang 6) 2 (
16 (2 1))
2()
(
k
k n k
k
W k f n
n j k
n
W
e e
2 )
2 ( 16
2 )
2 ( 16
π π
7
0
8 (2 1))
2()
(
k
nk n
k
W k f n
7
0
8
10( ) ( ))
(
k
nk n
k
W k f n
10( ) ( )
k
nk
W k f n
11( ) ( )
k
nk
W k f n
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
10( ) ( )
k
nk
W k f n
F
Xử lý nh trên chúng ta có
Trang 78 3
0
4 10
10( ) (2 ) (2 1)
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
0
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
20( ) ( )
k
nk
W k f n
21( ) ( )
k
nk
W k f n
Tơng tự
(n) F W - (n) F 4)
(n
F
16 22
22( ) ( )
k
nk
W k f n
Trang 923( ) ( )
k
nk
W k f n
(n) F W - (n) F 2) (n
16 32
(n) F W - (n) F 2) (n
(n) F W (n) F (n)
(n) F W - (n) F 2) (n
16 36
(n) F W - (n) F 2) (n
Các biểu thức từ (6.29) đến (6.36) cho kết quả trong bớc thứ ba của thuật toán và biểu
tử nữa và bớc này tạo thành sơ đồ cuối cùng (bớc đầu tiên) trong lu đồ
Trang 10H×nh 6.3 Bíc thø hai sau bíc cuèi cïng trong thuËt to¸n FFT.
Trang 11Hình 6.4 Bớc đầu tiên của lu đồ FFT.
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ámbớ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ố
log2 N và số phép cộng là Nlog 2 N Chú ý, thực tế số phép nhân sẽ giảm xuống một ít, vì
với hệ số xoay = 1
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ểnmộ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)
0
01010101 0101010101
Trang 13Hình 6.5 Lu đồ thuật toán thuật toán phân chia miền thời gian.
0 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 1410 k f
)(
11 k f
(b)
Trang 15T = 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]]);
Kế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. /*********************************** * Program developed by: *
* M.A.Sid-Ahmed *
* ver 1.0 1992 *
Trang 16* @ 1994 *
*********************************/
/* 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 *,
/* Allocating memory for bit reversal LUT */
L=(unsigned int *)malloc(N*sizeof(unsigned int));
/* Generate Look-up table for bit reversal */
Trang 17void 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]*/
void WTS(float *wr, float *wi, int N, int sign)
/* Generating LUT for twiddle factors
Note:
sign=-1 for FFT, and
sign=1 for IFFT */
{
int n2,i ;
float theta;
Trang 18You will need to use routine "bitreversal" for that purpose.
need to use routine LUT for calculating and storing twiddle factors.*/
Trang 19Chú ý rằng trong chơng trình 6.1 chúng ta giả thiết là dữ liệu đợc lu nh dãy của các ký
tự không dấu Nếu bạn muốn xử lý trên một số dấu phẩy động bạn cần thay đổi các câulệnh mở và đọc dữ liệu trong file dữ liệu Chơng trình này cũng cho phép lựa chọn FFThoặc IFFT Cho FFT, chơng trình con "WTS( ) " tính toán và lu các hệ số dịch xoaytrong một LUT đợc gọi lên vói tham số "sign" đợc gán giá trị -1, ví dụ, WTS(wr,wi,N,-1)
và cho IFFT, WTS(wr,wi,N,1) Với IFFT, bạn cần chia dãy ra cho N trong chơng trình gọihoặc là chơng trình chính
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
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ủahai 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ìnhgiố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ồmcác bớc sau:
kn 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
=
++
Trang 20
)]
2()
([)
12
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()([)
12
0
kn N
k N N
k
W W
N k f k f n
2
0
10 N kn N
k
W k f n
12
0
11 N kn N
k
W k f 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 đợccung cấp ở Chơng trình 6.2
Trang 21Có 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ạisao 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ầnxem xét phần kế tiếp, FFT giảm lợc.
void bit_reversal (unsigned int *, int, int);
void WTS(float *, float *, int, int) ;
void FFT(float *xr, float *xi , float, float, int, int);
order You will need to use routine "bit-reversal" to place them in normal ascending order
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 220 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 23giảm lợc (xem hình 6.8) Một giải thuật dựa trên tính toán các phần tử của bớm khi việc
ra FFT
Thuậ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
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 )
{
/* FFT pruning algorithm
Deimation-in-frequency algorithm
Trang 24N_output=Number of samples in the output sequence
M_input=Number of samples in the input sequence This should also be a multiple of2
You will need to use routine "bit-reversal" to place them in normal ascending order
need to use routine LUT for calculating and storing twiddle factors */
int ip,k,kk,l,inc r,iter,j,i;
04812 26101415 91337111 5
08412210 61419513
311715
08412 21061419 51331171 5
Trang 25Hình 6.8 Lu đồ thuật toán giảm lợc đầu vào, N=4
Trang 262 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 FFTscủ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 ratrong 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-
Trang 27Hì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.
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
0481 2261014 1591337 1115
0841 2210614 1951331 1715
Trang 282 The input arrays are assumed to be rearranged in bit-reverse order.
You will need to use routine "bit-reversal" for that purpose
need to use routine LUT for calculating and storing twiddle factors.*/
Trang 291)
(
ωω
ω
−+
=
H
của đáp ứng xung dùng FFT giảm lợc
6.4 2-D FFT
)}
,({
),()
,(
2 1
/ 2 2 1 2
1
1 2
2 2 1 1
k k h DFT
e k k h n
n
k
N k
k n k n N j
trong trờng hợp tổng quát, đầy đủ có thể biểu diễn theo:
2 1 2
/ 2 2 1 2
2 1
1 2
2 2 1 1
),(
1),
n
N n
k n k n N j
e n n H N
k k
Trang 306.4.2 Một số tính chất của 2-D DFT
Chuyển đổi Từ định nghĩa của 2-D DFT và IDFT cho thấy
),
()
,
b n a n H e
k k
) ( 2 2 1 2
1
2 1)
,(),
1 2
1 ( , )( ) ( , )( 1))
,2()
1)(
,
n
N n H k
k
ra đợc một phổ tần số mà điểm tần số (0,0) của nó sẽ nằm giữa mảng 2-D Biểu thức nàyrất hữu dụng trong hiển thị phổ tần số, phổ biên độ và lọc dùng DFT
Từ biểu thức (6.44) chúng ta rút ra kết luận rằng dịch chuyển một hằng số trong ảnh
sẽ không tác động đến phổ biên độ
)(
/ 2 2 1 2
1, ) ( , ) 1 2
lọc có đặc tuyến pha tuyến tính cho bởi biểu thức ở trên, kết quả sẽ là
a)-na,-(n
)]
,(),([),(])
,
(
[|
2 1
) (
/ 2 2 1 2 1 2
1 ) (
/ 2 2
f
b n a n N j b
n a n N j
i
e n n A n n I n n I e
có nghĩa là không dịch chuyển biên độ Trong khi đó nếu bộ lọc có đặc tuyến pha khôngtuyến tính thì pha của ảnh cũng bị biến dạng Lý do của sự biến dạng này là tất cả các
điểm đều phải chịu một sự dịch chuyển vị trí khác nhau tuỳ theo vị trí của ảnh Tổngquát, ảnh đã đợc lọc có thể cho bởi
Trang 31N) n N, H(n
N) n , H(n ) n N, H(n ) n , (n
2 1
2 1 2
1 2
1
++
=
+
=+
=H
N) k , h(k ) k N, h(k ) k , h(k
2 1
2 1 2
1 2
1
++
=
+
=+
=
(6.49)
Biến đổi DFT đối xứng liên hợp khi
) n
- , (-n
* H ) n ,
hoặc
) n
- , H(-n
k 2 =
sin r
φω
sin n
cos n
n H ab bk
Trang 32hoặc từ biểu thức (6.1) ta có thể viết
N
0
1 0 1
2 1
* ) k , (k
Điều này có nghĩa là, tích chập trong miền không gian biến thành phép nhân bình ờng trong miền tần số Tính chất này có thể dùng cho lọc 2-D qua DFT Chúng ta cần nhớlại rằng bạn đã dùng kỹ thuật lọc FIR trong các chơng trớc cho chức năng này Khi ápdụng các lọc bộ lọc FIR cho chức năng lọc bạn cần lấy tín hiệu khoảng cách 2-D đã đợcbiến thành tín hiệu có chu kỳ trớc khi tiến hành lấy DFT Sự không đồng bộ của chu kỳtrong biến đổi này cũng gây ra lỗi nh trong biến đổi 1-D Vì vậy, để tránh trờng hợp này
N
0
1 0 1
2 1
Trang 336.5 2-D FFT
Biểu thức cho 2-D DFT có thể dới dạng
1 1
1 2
2
2 2 / 1
0
1
0
/ 2 2 1 2
1, ) [ ( , ) ]
k
N k
k n N
e k k h n
0
2 1 2
1, ) ( , )
k
e k k h k
0 2
2) (0, ),
0
k
e k h n
/ 2 1
0 2
2) (1, ),
1
k
e k h n
Mỗi biểu thức trên biểu diễn DFT của một hàng trong ảnh
Biểu thức (6.63) cũng có thể mở rộng ra thành:
1
/ 2 1
0 1
1,0) ( ,0)
N k
e k G n
/ 2 1
0 1
1,1) ( ,1)
N k
e k G n
=
∑
=
.v.v
Các biểu thức này dẫn ta đến giải thuật sau đây tính FFT hai chiều:
1 Tính 1-D FFT cho tất cả các hàng, và chứa kết quả vào mảng trung gian