离散傅里叶变换

第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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值