Chương trình 6.7 " DISP_FFT.C" Chương trình dùng để đưa ra một file chứa phổ tần số trong dạng ảnh có thể hiển thị được.. log2N phép cộng phức để thu được 2-D FFT, N2 phép nhân phức tron
Trang 1Chương trình 6.7 " DISP_FFT.C" Chương trình dùng để đưa ra một file chứa phổ tần số trong dạng ảnh có thể hiển thị được
/************************
* Program developed by: *
*************************/
/**************************************************** Program for calculating the magnitude of the 2-D FFT given a file containing the complex values of the FFT
of an image The result is placed in a form suitable for display in image form and stored in an external file The mapping function D(u,v)=log10(1+ |(F(u,v)|)
is used
****************************************************** /
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <alloc.h>
#include <io.h>
#include <stdlib.h>
void main()
{
int i,j,k,N,NB1,NB2;
FILE *fptri, *fptro,*fptrt;
double nsq;
float max,min,xr,xi,scale;
float *buffi,*bufft;
char *buffo;
char file_name[14];
Trang 2Hình 6.13 Phổ của "IKRAM.IMG"
clrscr();
printf(""Enter name of file containing FFT data ->
");
scanf("%s",file_name);
fptri=fopen(file_name,"rb");
printf("Enter name of file for storing magnitude data -> ");
scanf("%s",file_name);
fptro=fopen(file_name,wb");
fptrt=fopen("temp.img","wb+");
nsq=(double)(filelength(fileno(fptri))/(2*sizeof(float )));
N=(int)(sprt(nsq));
max=0.0; min=1.0e9;
NB1=(N<<1)*sizeof(float);
NB2=NB1>>1;
buffi=(float *)malloc(NB1);
Trang 3bufft=(float *)malloc(NB2);
buffo(char *)malloc(N*sizeof(char));
for(i=0;i<N;i++)
{
fread(buffi,NB1,1,fptri);
for(j=0;j<N;j++) {
k=j<<1;
xr=buffi[k];
xi=buffi[k+1];
bufft[j]=(float)sqrt((double)(xr*xr+xi*xi)); bufft[j]=(float)log10((double)(1+bufft[j])); if(bufft[j]>max) max=bufft[j];
if(bufft[j]<min min=bufft[j];
} fwrite(bufft,NB2,1,fptrt);
} fclose(fptri);
fseek(fptrt,0,SEEK_SET);
scale=(float)255.0/(max-min);
for(i=0;i<N;i++)
{
fread(bufft,NB2,1,fptrt);
for(j=0;j<N;j++) buffo[j]=(char)((bufft[j]-min)*scale);
fwrite(buffo,N,1,fptro);
}
fclose(fptro);
fclose(fptrt);
remove("temp.img");
}
Bài tập 6.6 Tính 2D_FFT của " IKRAM.IMG" và hiển thị |H(u,v)| thay thế
cho hiện thị D(u,v) Chú ý dến sự suy giảm phổ ảnh và so sánh với trường hợp
hiển thị ảnh rút ra bởi chương trình 6.7
Bài tập 6.7 Lập một chương trình 2-D FFT theo các bước sau:
1 Thuật toán phân chia tần số
2 Thuật toán giảm lược đầu vào
3 Thật toán giảm lược đầu ra
Trang 44 Dùng thuật toán giảm lược đầu ra thiết kế một bộ lọc 2-D FIR thông thấp vói D0 = 0.3, kích thước 11 11 So sánh ví dụ 2.5 trong chương 2
6.7 Bộ lọc hai chiều dùng FFT
Nếu dùng tích chập để chuyển hàng loạt các phần tử từ miền không gian sang
miền tần số ta nên áp dụng FFT Phép biến đổi này yêu cầu 2 (N2/2) log2N phép nhân phức và 2 N2 log2N phép cộng phức để thu được 2-D FFT, N2 phép nhân phức trong miền tần số giữa FFT của điểm ảnh và các đáp ứng tần số cuả bộ lọc,
2 (N2/2) log2N phép nhân phức cho IFFT Mặt khác, một bộ lọc 2-D FIR có kích thước (2m + 1) (2m + 1) đòi hỏi (2m + 1)2 N2 phép nhân để thu được ảnh trực tiếp trong miền không gian Xem xét một ảnh có kích thước 512 512 điểm FFT yêu cầu:
4 4( (N2 / ) log2 2 N)4N2 45122 (291)
20 triệu phép nhân
Để đưa ra tính toán này chúng ta coi rằng một phép nhân phức thì bằng 4 phép nhân thông thường, và bộ lọc có pha zero Phương pháp không gian áp dụng cho một bộ lọc có kích thước 7 7 yêu cầu 7 7 5122 13 triệu phép nhân Nếu kích thước bộ lọc tăng lên thì phương pháp phân chia miền tần số có thể áp dụng Một bộ lọc có kích thước 11 11 yêu cầu khoảng 30 triệu phép nhân sẽ chỉ cần khoảng 19 triệu phép nhân khi áp dụng phương pháp phân chia miền tần số Hai phương pháp này sẽ có cùng một số phép nhân nếu
2 2 2
2
N 1) (2m 1) N (2log
Cho một ảnh có kích thước 512 512 (2m + 1) 9, dễ chứng minh là nếu kích thước bộ lọc nhỏ hơn 9 thì ta có thể phương pháp phân chia không gian Tuy nhiên, cần chú ý phương pháp phân chia tần số cũng yêu cầu ít thời gian xử lý hơn do số lần truy nhập đĩa giảm xuống Ưu điểm này được tăng lên khi kích thước của bộ lọc lớn hơn 9 9 Ưu điểm này sẽ không còn nữa khi xét đến lỗi wraparound Để tránh lỗi này ta phải tăng gấp bốn lần kích thước của ảnh Cho một ảnh có kích thước 512 512 ta cần phải tăng lên 1024 1024 Để tránh các
phép tính toán quá lớn khi chú ý rằng h(n 1 , n 2 ) của một bộ lọc khi rút ra IFFT sẽ tăng lên rất nhanh khi n 1 , n 2 tăng lên Tính chất này càng nổi bật khi mở rộng
Fourier chỉ chèn các giá trị zero vào các giá trị cuối của bộ lọc từ c/ n12 n22 Cần nhắc lại là cả đáp ứng tấn số và đáp ứng xung được xem xét khi làm việc với DFT
Trang 5Thuộc tính là h(n 1 , n 2 ) tăng lên một cách nhanh chóng được xem xét khi lựa
chọn phương án lọc Không phụ thuộc vào kích thước của ảnh, đưa ra phép nhân giứa đáp ứng tần số của ảnh và đáp ứng tần số của bộ lọc, và chúng ta chú ý rằng lỗi wrapapound chỉ xuất hiện ở miền nhỏ nằm ở đường bao của ảnh và trong phần lớn trường hợp lỗi này có thể bỏ qua
Phương pháp tần số có thể thực hiện qua các bước sau:
1 Rút ra 2-D FFT của một ảnh
I(k1,k2) FFTi(n1,n2)( 1 )n1n2
2 Nhân I(k 1 , k 2 ) với đặc tuyến của bộ lọc, chú ý là đáp ứng tần số có gốc toạ độ nằm tại (N/2, N/2) Cho ví dụ một bộ lọc thông cao Butterworth có đặc tuyến
như sau:
2 0
2 2
2 1
2 2
2 1 2
1
) 1 2 ( )
, (
D
H
2 (
2
1 1
N k
2 (
2
2 2
N k
Đáp ứng tần số của ảnh lọc có thể rút ra từ
2 (
2 ), 2 (
2 ( ) (
)
N
N k N H k k I k k
3 Ảnh đã lọc có thể rút ra từ :
i f(n1,n2){IFFT{G(k1,k2)}(1)n1n2
ở đây có nghĩa là phần thực của phần nằm trong hai dấu ngoặc
Bài tập 6.8 Viết một chương trình lọc 2-D trong mặt phẳng tần số Kiểm tra
chương trình dùng cùng một đặc tuyến tần số dùng thiết kế bộ lọc FIR lọc ảnh
trong hình 2.3 (chương 3) và so sánh kết quả
6.8 Vector biến đổi Fourier
Qua chiến lược chia để trị ta đạt được hiệu suất tính toán trên máy tính của giải thuật 1-D FFT Thuật toán FFT vector 2-D sau đâylà cùng một chiến lược Giải thuật DFT 2-D được xen kẽ với những giải thuật DFT 2-D nhỏ hơn, cuối cùng chỉ DFT 2-D của phần tử đơn được tính Chúng ta sẽ kiểm tra vector FFT Chúng ta
có
Trang 62 2 1 1 2
1
) , ( )
,
1 0 1 1
0 2
1
k n k n N N
k
N
k
W k k h n
n
j
W
2
Vì vậy có thể viết lại như sau:
2 1
2 1 2 2
2 1
1
2 2
1 2
0 1
1 2
0
1 2
2 1
1 2
0 2 1
) 1 2 , 2 (
) 2 , 2 ( )
, (
k n k N N
k N
k
n N
N
k
k n k N N
k
W k
k h W
W k k h n
n H
Tương tự với trường hợp1-D chúng ta có thể viết
) , ( )
, (
) , ( )
, ( )
, (
2 1 11 2
1 10
2 1 01 2
1 00 2
1
2 1 2
1
k k F W k k F W
k k F W k k F n n H
n n N
n N
n N
(6.68a)
) , ( )
, (
) , ( )
, ( )
, 2 (
2 1 11 2
1 10
2 1 01 2
1 00 2
1
2 1 2
1
k k F W k k F W
k k F W k k F n
N n H
n n N
n N
n N
(6.68b)
) , ( )
, (
) , ( )
, ( )
2 ,
(
2 1 11 2
1 10
2 1 01 2
1 00 2
1
2 1 2
1
k k F W k k F W
k k F W k k F
N n n H
n n N
n N
n N
(6.68c)
2 2 1
2 1
2 1
2 2 1
2 1 1
2 2
1 2
0 1
1 2
0
2 2
1 2
0 1
1 2
0
) 1 2 , 1 2 (
) 2 , 1 2 (
k n k N N
k N
k
n n N
k k N N
k N
k
n N
W k
k h W
W k k
h W
Trang 7) , ( )
, (
) , ( )
, ( ) 2
, 2 (
2 1 11 2
1 10
2 1 01 2
1 00 2
1
2 1 2
1
k k F W k k F W
k k F W k k F
N n
N n H
n n N n
N
n N
(6.68d)
Dạng công thức cuối cùng được biết đến như một bướm cơ số (2 2) Mỗi
bướm cần đến ba phép nhân và tám phép cộng, để tính toán một bước của giải
thuật FFT đòi hỏi N2/4 bướm (việc kiểm chứng được giành cho độc giả coi như là một bài tập) Số bước cần thiết để thực hiện giải thuật FFT 2-D là log2N, vì vậy số phép nhân cần thực hiện là
log N
4
3N
2 2
Với phương pháp này số hàng-cột cần thiết sẽ nhỏ hơn 25 phần trăm so với số hàng-cột được mô tả trước đây Tuy nhiên phương pháp này sẽ chỉ có hiệu quả
nếu có đủ bộ nhớ hoạt động lưu giữ N N số phức
Bài tập 6.9
1 Phát triển thuật toán và chương trình C cho giải thuật phân chia thời gian
2-D FFT cơ số vector
2 Biến đổi công thức để chia tần số vector FFT 2-D
3 Phát triển thuật toán giảm lược đầu vào và đầu ra, viết chương trình C cho
2-D FFT cơ số vector