第1关:二维离散傅里叶变换DFT
任务描述:
本关任务:在MyDFT.cpp补充代码,完成二维离散傅立叶变换。
####相关知识:
####测试说明:
在main.cpp中对编写的代码进行测试:
测试输入:无
预期输出:True!
####注意事项:
main.cpp为评测文件,请不要随意修改,否则将导致评测不能正常执行
#include "BMP.h"
//һά¸µÀïÒ¶±ä»»
void dft1(double *x, double *y,double *a,double *b,int n)
/*x-Ë«¾«¶ÈʵÐÍһάÊý×飬³¤¶ÈΪn¡£´æ·ÅÒª±ä»»Êý¾ÝµÄʵ²¿¡£
y-Ë«¾«¶ÈʵÐÍһάÊý×飬³¤¶ÈΪn¡£´æ·ÅÒª±ä»»Êý¾ÝµÄÐ鲿¡£
a-Ë«¾«¶ÈʵÐÍһάÊý×飬³¤¶ÈΪn¡£´æ·Å±ä»»½á¹ûµÄʵ²¿¡£
b-Ë«¾«¶ÈʵÐÍһάÊý×飬³¤¶ÈΪn¡£´æ·Å±ä»»½á¹ûµÄÐ鲿¡£
n-ÕûÐͱäÁ¿¡£Êý¾Ý³¤¶È¡£
*/
{
int i,j;
double c,d,w,s;
for(i=0;i<n;i++)
{
a[i] = b[i] = 0;
w = 2*3.1415926*i/n;
for(j=0;j<n;j++)
{
d = j*w;
c = cos(d);
s = sin(d);
a[i] += c*x[j] + s*y[j];
b[i] += c*y[j] - s*x[j];
}
//a[i] = a[i]/n;
//b[i] = b[j]/n;
}
}
BMP_Image* MyDFT(BMP_Image* Image_In)
{
//double t1=(double)cvGetTickCount();
BMP_Image* Image_DFT;
Image_DFT = (BMP_Image*)malloc(sizeof(BMP_Image));
Image_DFT->width = Image_In->width ;
Image_DFT->height = Image_In->height ;
Image_DFT->biBitCount = 8;
Image_DFT->imageRgbQuad = (BMP_RgbQuad*)malloc(sizeof(BMP_RgbQuad)*256);
Image_DFT->imageData = (unsigned char*)malloc((Image_In->height)*(Image_In->width));
int i,j;
for(i=0;i<256;i++)
{
Image_DFT->imageRgbQuad[i].rgbBlue = Image_In->imageRgbQuad[i].rgbBlue;
Image_DFT->imageRgbQuad[i].rgbGreen = Image_In->imageRgbQuad[i].rgbGreen;
Image_DFT->imageRgbQuad[i].rgbRed = Image_In->imageRgbQuad[i].rgbRed;
Image_DFT->imageRgbQuad[i].rgbReserved = 0;
Image_DFT->imageRgbQuad[i].rgbBlue = Image_In->imageRgbQuad[i].rgbBlue;
Image_DFT->imageRgbQuad[i].rgbGreen = Image_In->imageRgbQuad[i].rgbGreen;
Image_DFT->imageRgbQuad[i].rgbRed = Image_In->imageRgbQuad[i].rgbRed;
Image_DFT->imageRgbQuad[i].rgbReserved = 0;
Image_DFT->imageRgbQuad[i].rgbBlue = Image_In->imageRgbQuad[i].rgbBlue;
Image_DFT->imageRgbQuad[i].rgbGreen = Image_In->imageRgbQuad[i].rgbGreen;
Image_DFT->imageRgbQuad[i].rgbRed = Image_In->imageRgbQuad[i].rgbRed;
Image_DFT->imageRgbQuad[i].rgbReserved = 0;
}
double *Image_In_R = (double*)malloc(sizeof(double)*(Image_In->height)*(Image_In->width));
double *Image_In_I= (double*)malloc(sizeof(double)*(Image_In->height)*(Image_In->width));
double *Image_TMP_R = (double*)malloc(sizeof(double)*(Image_In->height)*(Image_In->width));
double *Image_TMP_I= (double*)malloc(sizeof(double)*(Image_In->height)*(Image_In->width));
double *Image_OUT_R= (double*)malloc(sizeof(double)*(Image_In->height)*(Image_In->width));
double *Image_OUT_I= (double*)malloc(sizeof(double)*(Image_In->height)*(Image_In->width));
double *Image_TMP_R_1 = (double*)malloc(sizeof(double)*Image_In->width);
double *Image_TMP_I_1 = (double*)malloc(sizeof(double)*Image_In->width);
double *Image_TMP_R_2 = (double*)malloc(sizeof(double)*Image_In->width);
double *Image_TMP_I_2 = (double*)malloc(sizeof(double)*Image_In->width);
for(i=0;i<Image_In->height*Image_In->width;i++)
{
Image_In_R[i] = Image_In->imageData[i]/255.0;
Image_In_I[i] = 0.0;
}
/*********** 2-D FFT ¿ªÊ¼ *************/
//¶ÔÐÐÊý¾Ý×öһάDFT
for(i=0;i<Image_In->height;i++)
{
for(j=0;j<Image_In->width;j++)
{
Image_TMP_R_1[j] = Image_In_R[i*Image_In->width + j] ;
Image_TMP_I_1[j] = 0.0 ;
}
dft1(Image_TMP_R_1,Image_TMP_I_1,Image_TMP_R_2,Image_TMP_I_2,Image_DFT->width);
for(j=0;j<Image_In->width;j++)
{
/********* Begin *********/
Image_TMP_R[i*Image_In->width + j] = Image_TMP_R_2[j];
Image_TMP_I[i*Image_In->width + j] = Image_TMP_I_2[j];
/********* End *********/
}
}
//¶ÔÁÐÊý¾Ý×öһάDFT
for(i=0;i<Image_In->width;i++)
{
for(j=0;j<Image_In->height;j++)
{
Image_TMP_R_1[j] = Image_TMP_R[j*Image_In->width + i];
Image_TMP_I_1[j] = Image_TMP_I[j*Image_In->width + i];
}
dft1(Image_TMP_R_1,Image_TMP_I_1,Image_TMP_R_2,Image_TMP_I_2,Image_DFT->width);
for(j=0;j<Image_In->height;j++)
{
/********* Begin *********/
Image_OUT_R[j*Image_In->width + i] = Image_TMP_R_2[j];
Image_OUT_I[j*Image_In->width + i] = Image_TMP_I_2[j];
/********* End *********/
}
}
/*********** 2-D FFT ½áÊø *************/
for(i=0;i<Image_In->height*Image_In->width;i++)
{
Image_OUT_R[i] = Image_OUT_R[i]*Image_OUT_R[i];
Image_OUT_I[i] = Image_OUT_I[i]*Image_OUT_I[i];
Image_OUT_R[i] = log(sqrt(Image_OUT_R[i]+Image_OUT_I[i])+1);
}
double max = Image_OUT_R[0];
double min = Image_OUT_R[0];
for(i=0;i<Image_In->height*Image_In->width;i++)
{
if(max<Image_OUT_R[i]) max = Image_OUT_R[i];
if(min>Image_OUT_R[i]) min = Image_OUT_R[i];
}
for(i=0;i<Image_In->height*Image_In->width;i++)
{
double tmp1 = (Image_OUT_R[i]/(max-min) - min/(max-min));
double tmp2 = Image_OUT_R[i];
Image_DFT->imageData[i] = char((Image_OUT_R[i]/(max-min) - min/(max-min))*255);
}
return Image_DFT;
}