116
int iter,i,k;
int k1,inc1;
int k2,j,k3,k4;
char *buff1,*buff2,tmp;
long loc;
buff1=(char *)malloc(N*sizeof(char));
buff2=(char *)malloc(N*sizeof(char));
N1=N/2;
inc=1;
inc1=2;
00 02 04 06
11 13 15 17
20 22 24 26
01 03 05 07
10 12 14 16
21 23 25 27
30 32 34 36
41 43 45 47
50 52 54 56
31 33 35 37
40 42 44 46
51 53 55 57
61 63 65 67
70 72 74 76
60 62 64 66
71 73 75 77
41
43
50
52
40
42
51
53
61
63
70
72
60
62
71
73
bíc 0 bíc 2
04
06
15
17
24
26
05
07
14
16
25
27
34
36
35
37
00
02
11
13
20
22
01
03
10
12
21
23
30
32
31
33
45
47
54
56
44
46
55
57
65
67
74
76
64
66
75
77
00
02
04
06
11
13
15
17
20
22
24
26
01
03
05
07
10
12
14
16
21
23
25
27
30
32
34
36
41
43
45
47
50
52
54
56
31
33
35
37
40
42
44
46
51
53
55
57
61
63
65
67
70
72
74
76
60
62
64
66
71
73
75
77
00
11
01
10 02
13
03
12 04
1505
14 06
17
07
16
20
21
30
31
22
23
32
33
24
25
34
35
26
27
36
37
41
50
40
51 43
52
42
53 45
5444
55 47
56
46
57
61
70
60
71 63
72
62
73 65
7464
75 67
76
66
77
bíc 1 Ma trËn chuyÓn vÞ
117
Hình 6.10 Thuật toán của Eklundh cho dịch chuyển một ma trận.
for(iter=0;iter<n;iter++)
{
gotoxy(1,2);
printf("iteration # %4d",iter+1);
k1=0 ;
for(k=0;k<N1;k++)
{
for(i=k1;i<(k1+inc);i++)
loc=(long)(N)*(long)(i);
if(fseek(fptr,loc,SEEK_SET)!=0)
{
perror("fseek failed");
exit(1);
}
else
{
gotoxy(1,3);
printf("Reading row # %4d",i);
for(k4=0;k4<N;k4++)
*(buff1+k4)=fgetc(fptr);
{
loc=(long)(N)*(long)(i+inc);
}
if(fseek(fptr,loc,SEEK_SET)!=0)
{
perror("fseek failed");
exit(1) ;
}
else
{
gotoxy(1,4);
printf("Reading row # %4d",i+inc);
for(k4=0;k4<N;k4++)
*(buff2+k4)=fgetc(fptr);
}
k3=0;
for(k2=0;k2<N1;k2++)
{
118
for(j=k3;j<(k3+inc);j++)
{
tmp=*(buff1+j+inc);
*(buff1+j+inc)=*(buff2+j);
*(buff2+j)=tmp;
}
k3+=inc1 ;
}
loc=(long)(N)*(long)i;
if(fseek(fptr,loc,SEEK_SET)!=0)
{
perror("fseek failed");
exit( 1 ) ;
}
else
{
gotoxy(1,3);
printf("writing row # %4d",i);
for(k4=0;k4<N;k4++)
putc((char)(*(buff1+k4)),fptr);
}
loc=(long)(N)*(long)(i+inc);
if(fseek(fptr,loc,SEEK_SET)!=0)
{
perror("fseek failed");
exit(1) ;
}
else
{
gotoxy(1,4);
printf("writing row # %4d",i+inc);
for(k4=0;k4<N;k4++)
putc((char)(*(buff2+k4)),fptr);
}
}
k1+=inc1 ;
}
inc*=2;
119
inc1*=2;
N1/=2;
}
Để kiểm tra chương trình 6.5 chúng ta s áp dụng thuật toán này lên ảnh cho
trong hình 6.11. nh này chứa trên đĩa đi kèm theo cuốn sách này dưới file tên
là “MOHSEN.IMG”.
Chương trình 6.6 “ FFT2D.C” 2-D FFT
/******************************
* Program developed by: *
* M.A.Sid-Ahmed. *
* ver. 1.0 1992. *
* @ 1994 *
******************************/
/* 2D-FFT - Using Decimation-in-time routine.*/
#define pi 3.141592654
#include <stdio.h>
#include <math.h>
#include <alloc.h>
#include <stdlib.h>
#include <io.h>
#include <conio.h>
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);
120
Hình 6.11 Ảnh đã được dịch chuyển, "MOHSEN.IMG".
void main()
{
int N,n2,m,k,i;
unsigned int *L;
float *wr , *wi;
char file_name[14];
FILE *fptr,*fptro;
double nsq;
clrscr();
printf(" Enter name of input file-> ");
scanf("%s",file_name);
if((fptr=fopen(file_name,"rb"))==NULL)
{
printf("file %s does not exist.\n");
exit(1);
}
nsq=(double)filelength(fileno(fptr));
N=sqrt(nsq);
m=(int)(log10((double)N)/log10((double)2.0));
k=1 ;