燕 山 大 学 课 程 设 计
等格式。
3.2 程序设计
① init( ):将图形驱动软件装入内存,使屏幕适配器设置为图形方式,即图形初
始化;
② make_original_data( ):置数程序,以取得有关二维数组,进行傅里叶变换; ③ do_2D_DFT( ):完成二维离散傅里叶正变换,通过绘图程序将运算结果显示在
屏幕上;
④ do_2D_IDFT( ):完成二维离散傅里叶逆变换,通过绘图程序将运算结果显示
在屏幕上,使其与原图像相比较,以检验变换的恢复情况;
⑤ filter( ):在这个子程序中,我们可以通过选择有效对空间频谱进行滤波,滤去
不需要谱线,保留有效谱线,突出重要部分,削弱次要因素,达到对空间频谱处理目的。
do_2D_DFT( ) { getch( ); fft2(xx,yy,1);
disp_fft(200,360,6,0.03);
gotoxy(30,25);printf(“ 2D-FFT ”); }
;------------------------------------------------------------------------------------------------------------
do_2D_IDFT( )
{int imin , imax , jmax , fg=1; char c;
outtextxy(100, 430, “filter? (Y/N) : ”); c= getch( ); delline( ); if( c = = ?y? | | c = = ?Y?) {
while(fg) { gotoxy (60,21);
7
燕 山 大 学 课 程 设 计 printf ( “0< = = > % d:”, ( size > > 1) ); gotoxy (60,22);
printf(“input imin:”); scanf(“%d”,& imin ); gotoxy (60,23);
printf(“input imax:”); scanf(“%d”,& imax); gotoxy (60,24);
printf(“input jmin:”); scanf(“%d”,& jmin ); gotoxy (60,25);
printf(“input jmax:”); scanf(“%d”,& jmax); fg= filter( imin, imax, jmin, jmax); }
setfillstyle( EMPTY_FILL,0 ); bar3d( 0,220,639,420,0,0 ); disp_fft( 160,380,6,0.03 ); }
fft2( xx, yy, - 1 ); disp_data( 325,164,2,0.5 );
gotoxy( 42,13 ); printf( “2D_IFFT ” ); if( c = = ??y? | | c = = ?Y?)
{ gotoxy (56,12 ); printf ( “i:- < = = > - \\ n”, imin , imax ); gotoxy(56,13);
printf( “j : % 2d < = = > % 2d \\ n ”, jmin , jmax); } }
;------------------------------------------------------------------------------------------------------ fft 2( xx, yy, flag )
float xx [SIZE] [SIZE],yy [SIZE] [SIZE]; int flag ;
{ float x [SIZE],y [SIZE]; Int i, j;
for(i= 0;i < size; i+ + )
8
燕 山 大 学 课 程 设 计
{ for ( j=o; j < size; i+ + )
{x [ j ] = xx[ j ] [ i ]; y[ j ]= yy[ j ] [ i ];} fft 1 (x, y, flag); for ( j= 0; j< size; j+ + )
{xx[ j ] [ i ] = x[ j ];yy [ j ] [ i ] = y [ j ]; } }
for(i = 0; j < size; i + + ) { for(j=0 ; j< size; j+ +)
{ x[ j ] = xx[ i ] [ j ]; y[ j ] = yy[ i ] [ j ]; } fft 1( x, y, flag ); for( j= 0; j< size; j+ + );
{xx[ i ][ j ] = x[ j ]; yy[ i ] [ j ] = y [ j ];} } }
;-------------------------------------------------------------------------------------------------------- fft ( xx, yy, flag ) float xx [ ], yy [ ]; int flag; {
int dn, pow , m , j1 , i , j , k , ndv2 , arg , w; float c , s , t1 , t2 ; mk_table( );
dn = size; w = 1; pow = ketasuu( size ); for( i = 0;i < pow; i + + ) {
m = dn; dn = dn/2; arg = 0; for( j= o; j< dn; j+ + ) {
c= _cos[ arg ]; s= - flag* _sin[ arg ];
arg= arg+ w; k= m;
9
燕 山 大 学 课 程 设 计 do{
j1 = k- m+ j; j2= j1+ dn; t1= xx[ j1 ]- xx[ j2 ]; t2= yy[ j1 ] – yy[ j2 ];
xx[ j1] = xx[ j1 ] + xx[ j2 ]; yy[ j1 ] = yy[ j1 ]+ yy[ j2 ];
xx[ j2 ] = ( c* t1 + s* t2 ); yy[ j2 ] = (c* t2 – s* t1 ); k = k +m; }while( k< = size ); } w= w* 2; }
j= 0; ndv2= siza/ 2; for( i= 0; i< siza – 1; i+ + ) { if ( i< j )
{ t1= xx[ j ]; t2= yy[ j ]; xx[ j ] = xx[ i ]; yy[ j ]= yy[ i ] xx[ i ] = t1; yy[ i ] = t2; }
k = ndv2; while( k< = j ) { j= j – k; k= k/2; } j = j+ k; }
if (flag= = - 1)
for( j=0;j< size;j + + ) { xx[ j ] = xx [ j ]/ size;
10