二维傅里叶变换c程序
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include"FFT.h"
//申请二维动态数组的函数
void MySpace(float ***p, int m, int n)
{
int i;
*p=(float **)calloc(m,sizeof(float *));
for(i=0; i<m; i++)
(*p)=(float *)calloc(n,sizeof(float));
}
//释放申请的二维动态数组
void FreeMySpace(float ***p, int m)
{
int i;
for(i=0; i<m; i++)
free((*p));
free(*p);
}
//矩阵转置a->b
void Zhuan(float ***a,float ***b,int m,int n)
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
(*b)=(*a);
}
//2D-FFT tag=1,正变换;tag=-1,反变换
void FFT2D(float **xr,float **xi,int m,int n,int tag)
{
int i,j,k1,k2;
float **xtr, **xti;
MySpace(&xtr,n,m);
MySpace(&xti,n,m);
k1=(int)(log(n)/log(2)+0.5);
k2=(int)(log(m)/log(2)+0.5);
for(i=0; i<m; i++)
fft(xr,xi,k1,tag);
Zhuan(&xr,&xtr,m,n);
Zhuan(&xi,&xti,m,n);
for(i=0; i<n; i++)
fft(xtr,xti,k2,tag);
Zhuan(&xtr,&xr,n,m);
Zhuan(&xti,&xi,n,m);
FreeMySpace(&xtr,n);
FreeMySpace(&xti,n);
}
void main()
{
int i,j;
const int M=64;
const int N=256;
float **xr, **xi;
FILE *fp1, *fp2;
MySpace(&xr,M,N);
MySpace(&xi,M,N);
fp1=fopen("2D-test-64-256.dat","rb" );
fp2=fopen("2D-64-256.dat","wb" );
for(i=0; i<M; i++)
for(j=0; j<N; j++)
fread(&xr,sizeof(float),1,fp1);
FFT2D(xr,xi,M,N,1);
for(i=0; i<M; i++)
for(j=0; j<N; j++)
fwrite(&xr,sizeof(float),1,fp2);
FreeMySpace(&xr,M);
FreeMySpace(&xi,M);
}
页:
[1]