⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nllbfdlg.cpp

📁 平均功率谱密度多维分形,可以计算二维位场数据的分维值
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	 ofn.hwndOwner         = ::GetFocus();
	 ofn.hInstance         = NULL;; 
	 ofn.lpstrFilter       = "文本文件(*.txt)\0*.txt\0All Files(*.*)\0*.*\0";
	 ofn.lpstrCustomFilter = NULL; 
	 ofn.nMaxCustFilter    = 0;
	 ofn.nFilterIndex      = 0; 
	 ofn.lpstrFile         = FileBName; 
	 ofn.nMaxFile          = _MAX_PATH; 
	 ofn.lpstrFileTitle    = NULL;
	 ofn.nMaxFileTitle     = _MAX_FNAME; 
	 ofn.lpstrInitialDir   = NULL;
	 ofn.lpstrTitle        = "浏览"; 
	 ofn.Flags             = 0;
	 ofn.nFileOffset       = 0; 
	 ofn.nFileExtension    = 0;
	 ofn.lpstrDefExt       = "txt"; 
	 ofn.lCustData         = 0L;
	 ofn.lpfnHook          = NULL; 
	 ofn.lpTemplateName    = NULL;
	 if(GetOpenFileName(&ofn))
	 {
		 m_EditDataInB.SetWindowText(FileBName);
	     m_EditDataOut.SetWindowText("DataOut.txt");
	 }
    
	 /////如果文件名不为空
	 if(strlen(FileBName))
	 {
	    ////读取文件输入文件B的头信息  
        if((fpIn=fopen(FileBName,"r"))==NULL)
		{
    	    strcat(FileBName,".txt");
	        if((fpIn=fopen(FileBName,"r"))==NULL)
			{
			    MessageBox( "读文件失败!!!",
							"信息",
							MB_ICONINFORMATION|MB_OK);
			}
		}
	   
        ///////读取六行文件头,取得左下角坐标及网格间距//调试成功
        for(k=1;k<=12;k++)
	       fscanf(fpIn,"%s",&szBufStrB[k]);
		cols=atoi(szBufStrB[2]);//读取输入文件列数//调试成功
        rows=atoi(szBufStrB[4]);//读取输入文件行数//调试成功
        xcor=atof(szBufStrB[6]);//读取左下角横坐标//调试成功
        ycor=atof(szBufStrB[8]);//读取左下角纵坐标//调试成功
        cellsize=atof(szBufStrB[10]);//读取网格间距//调试成功
        
        if (strcmp(szBufStrB[1],"ncols")==0)
		{
			datamax=0;
		    datamin=0;
			dataaver=0.0;
		    for(i=1;i<=rows;i++)
			{	
  	           for(j=1;j<=cols;j++)
			   {
	              fscanf(fpIn,"%f",&dtmida);//读取输入数据文件
				  dataaver=dataaver+dtmida*1.0/(rows*cols);//求平均值
			      if(dtmida>datamax)//求最大值
	                datamax=dtmida;
			      if(dtmida<datamin)//求最小值
				    datamin=dtmida;
			   }
			}
        
            fclose(fpIn);//关闭文件B
            sprintf(szBufMax,"%f",datamax);
            sprintf(szBufMin,"%f",datamin);
            sprintf(szBufAver,"%f",dataaver);
		    //sprintf(szBufCols,"%s",sizeof(szBufStrB[1]));

		 
            ////在文件头信息中输入行数列数和间距
            m_EditRows.SetWindowText(szBufStrB[4]);
            m_EditCols.SetWindowText(szBufStrB[2]);
            m_EditCellSize.SetWindowText(szBufStrB[10]);
		    m_EditMax.SetWindowText(szBufMax);
		    m_EditMin.SetWindowText(szBufMin);
            m_EditAverage.SetWindowText(szBufAver);
            
		}
        
		else
		{
			MessageBox( "原始数据文件格式不正确!!!",
							"信息",
							MB_ICONINFORMATION|MB_OK);
			
			////清空原始数据的信息
            m_EditRows.SetWindowText("");
            m_EditCols.SetWindowText("");
            m_EditCellSize.SetWindowText("");
		    m_EditMax.SetWindowText("");
		    m_EditMin.SetWindowText("");

			//sprintf(szBufDataIna,"%s","");
	        m_EditDataInB.SetWindowText("");
			//sprintf(szBufDataOut,"%s","");
		
		}
		
	 }
}

 //void CNllbfDlg::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult) 
 //{
 //	// TODO: Add your control notification handler code here
 //	COleDateTime dtChosenTime;
 	
 //	switch(pNMHDR->idFrom)
 //	{
 //	case IDC_TIMER:
 //		m_MyTime.GetTime(dtChosenTime);
 //	    m_Time.SetWindowText(dtChosenTime.Format("%M:%S"));
 //	break;
   //         
 //	}
 //	*pResult = 0;/
//}

BOOL CNllbfDlg::ADD(char szBufFileIn[],char szBufFileOut[])
{
	////显示等待提示框
    m_Status.SetWindowText("程序正在计算,请耐心等待...");
    
////分配数组空间	
//CArray<float,float> DTR;//用于参数设置文件
CArray<float,float> DTIN[ROWS_MAX];//用于原始数据文件
//CArray<float,float> DTN;//用于输出数据文件
//CArray<float,float> DTX;//用于存放X数据
//CArray<float,float> DTY;//用于存放Y数据
//CArray<float,float> DTFDV[ROWS_MAX];//用于存放分维值Fractal Dimension Value
//CArray<float,float> DTCORX[ROWS_MAX];//用于存放各分区的中心横向坐标
//CArray<float,float> DTCORY[ROWS_MAX];//用于存放各分区的中心纵向坐标

int cols,rows,panum,midnum;//横向和纵向的间距及行数和列数对分区数取模的余数
//intev=0;inteh=0;modv=0;modh=0;
double xcor,ycor,cellsize,xtcor,ytcor,newxcor,newycor;
xcor=0.0;ycor=0.0;cellsize=0.0;
int i,j,l,n,m,p,q;//循环变量
i=0;j=0;k=0;l=0;
float x[10],y[10],ab[4],dt[3];
static int corrnum;//最终分界点的位置数;
float result,dtmidc;
int intever,intehor,pntver,pnthor;//纵向间距,横向间距,纵向滑过点数,横向滑动点数
int numver,numhor,modver,modhor;//纵向及横向分区的个数
float corrst;
static int num; //大于指定含量的元素个数
int mp,np,mr,nr; 
intever=32;//滑动窗口纵向点数
intehor=32;//滑动窗口横向点数
mp=intever;//二维FFT纵向点数
np=intehor;//二维FFT横向点数
mr=2;//横向点数2次方,不参与计算
nr=2;//纵向点数2次方,不参与计算
pntver=16;//纵向滑动的点数
pnthor=16;//横向滑动的点数
numver=1;//初始纵向分区数
numhor=1;//初始横向分区数
modver=0;//初始纵向取模
modhor=0;//初始横向取模

//////*************************工作正式开始******************************************************

////给输入数据赋初值为零(分配空间)
  for(i=0;i<=2000;i++)
  {
	DTIN[i].SetSize(COLS_MAX,COLS_MAX);//原始数据
//	DTCORX[i].SetSize(COLS_MAX,COLS_MAX);
  //  DTCORY[i].SetSize(COLS_MAX,COLS_MAX);
//	DTFDV[i].SetSize(COLS_MAX,COLS_MAX);
  }
 
  //////////////************读入原始数据的头信息数据*************************************
  ////打开原始数据文件
    if((fpIn=fopen(szBufDataIn,"r"))==NULL)
 	{
    	strcat(szBufDataIn,".txt");
	     if((fpIn=fopen(szBufDataIn,"r"))==NULL)
		 { 
			MessageBox( "读文件失败!!!",
							"信息",
							MB_ICONINFORMATION|MB_OK);
		       return FALSE;
		 }
	}
	   
  ///////读取六行文件头,取得左下角坐标及网格间距//调试成功
  for(k=1;k<=12;k++)
	 fscanf(fpIn,"%s",&szBufStrB[k]);
  cols=atoi(szBufStrB[2]);//读取输入文件列数//调试成功
  rows=atoi(szBufStrB[4]);//读取输入文件行数//调试成功
  xcor=atof(szBufStrB[6]);//读取左下角横坐标//调试成功
  ycor=atof(szBufStrB[8]);//读取左下角纵坐标//调试成功
  cellsize=atof(szBufStrB[10]);//读取网格间距//调试成功

  //左上角坐标
  xtcor=xcor;
  ytcor=ycor+rows*cellsize;

  ///求分区的个数
  modver=(rows-intever)%pntver;//纵向求余
  
  numver=int((rows-intever-modver)/pntver)+1;//纵向分区个数
  if(numver==0)
  {
	  numver=1;
  }
  modhor=(cols-intehor)%pnthor;//横向求余
  //numhor=int((cols-intehor-modhor)/pnthor);//横向分区个数
  numhor=int((cols-intehor-modhor)/pnthor)+1;//横向分区个数
  if(numhor==0)
  {
	  numhor=1;
  }

  ////*****************8开始读入数据文件A******************************
  for(i=1;i<=rows;i++)
  {	
  	for(j=1;j<=cols;j++)
	{
	   fscanf(fpIn,"%f",&dtmida);
	   DTIN[i].SetAtGrow(j,dtmida);
	}
  }
  fclose(fpIn);//关闭文件A
 
  /////读入各分区数据
  float c[10];//存放系数,c[0]-常数项,c[1]-一次项系数,c[2]-分维数
  CNumber *scd;//分区复数数据,sectional complex data
  scd=new CNumber[(mp+1)*(np+1)];
  float dtxcor[100][100],wn[500],spd[500];
  float dtycor[100][100];
  
  ///打开或新建一个文件以输出数据
  if((fpOut =fopen(szBufDataOut,"w"))==NULL)
  {
      strcat(szBufDataOut,".txt");
	  if((fpOut=fopen(szBufDataOut,"r"))==NULL)
	  {
	      MessageBox("写文件失败!!!", "信息",MB_ICONINFORMATION|MB_OK);
		  return FALSE;
	  }
  }

  //****计算每个分区数据的分维值并输出
  for(k=1;k<=numver;k++)//纵向分区的个数
  {
	 for(p=1;p<=numhor;p++)//横向分区的个数
	 {
		  
     	 //分区数据块赋值
		 for(i=1;i<=mp;i++)//纵向间隔
		 {
	       for(j=1;j<=np;j++)//横向间隔
		   {
			  scd[(i-1)*mp+j].re=DTIN[i+(k-1)*pntver][j+(p-1)*pnthor];//通过
		      scd[(i-1)*mp+j].im=0.0;
		   }
		 }
		 
		 ////求分区中心坐标
         newxcor=xtcor+(intehor/2.0+(k-1)*pnthor)*cellsize;
		 newycor=ytcor-(intever/2.0+(p-1)*pntver)*cellsize;
		 dtxcor[k][p]=newxcor;
         dtycor[k][p]=newycor;

		 //二维付立叶正变换//通过
		 fft2d(scd,mp,np,mr,nr,1);
		 //功率谱密度,返回块数据的分维数
		 specd(scd,mp,np,mr,nr,3.2,&wn[0],&spd[0],&c[0]);

         //最小二乘求分维值
		 //ercheng(&wn[1],&spd[1],&c[0],mp);//y=c[1]*x+c[0],通过
	     //c[2]=4.0+c[1]/2.0;//分维值,据吴小羊
	     //tdta=1.0-c[1];
	     //tdta=abs(tdta);
	     //c[2]=3.5-tdta/2.0;//据李桐林
///*
		 //**********开始,检查功率谱及波数的正确性*******
		 int ilng;
		 ilng=int(c[7]);
	     
		 for(i=1;i<=ilng;i++)
		 {
             //fprintf(fpOut,"%f   ", wn[i]);//输出一次项系数
		     fprintf(fpOut,"%f   ", spd[i]);//输出一次项系数
		 }

		 //**********结束,检查功率谱及波数的正确性*******
//*/
 
		 fprintf(fpOut,"%f,  ", float(newxcor));//输出X坐标
         fprintf(fpOut,"%f,  ", float(newycor));//输出Y坐标
         //fprintf(fpOut,"%f   ",c[0]);//输出常数项
		 fprintf(fpOut,"%f   ", c[1]);//输出一次项系数
         fprintf(fpOut,"%f   ", c[2]);//输出分维值
		 fprintf(fpOut,"%f   ", c[3]);//minr
		 fprintf(fpOut,"%f   ", c[4]);//maxr
         //fprintf(fpOut,"%f   ", c[5]);//输出分维值
		 fprintf(fpOut,"%f   ", c[6]);//数组spd不为零的个数
         fprintf(fpOut,"%f   ", c[7]);//数组spd不为零的个数

		 fprintf(fpOut,"\n");
     }    
   }
  
   fclose(fpOut);//关闭文件

 //////删除各数组中的元素
 for(i=0;i<=rows+10;i++)
 {
	  DTIN[i].RemoveAll();
 } 

  return TRUE;

}//ADD function end

//*********最小二乘法拟合直线函数**********//
//    y=a[0]+a[1]*x                        //
//    x[]:输入X数据                        //
//    y[]:输入Y数据                        //
//    a[]:存放系数                         //
//      m:数据个数                         //
//                                         //
//*****************************************//
void CNllbfDlg::ercheng(float x[], float y[], float a[], int m)
{
	int i;
	float averx,avery,mida,midb;
	averx=0.0;
	avery=0.0;
	mida=0.0;
	midb=0.0;
	a[0]=0.0;
	a[1]=0.0;
	
	//求出X和Y数据的平均值averx,avery
	for(i=0;i<=m-1;i++)//下标从1开始
	{
		averx=averx+x[i]*1.0/m;
		avery=avery+y[i]*1.0/m;
	}
    
	//求一次项系数a[1]
	for(i=0;i<=m-1;i++)//下标从1开始
	{
		mida=mida+(x[i]-averx)*(y[i]-avery);
		midb=midb+(x[i]-averx)*(x[i]-averx);
	}
    
	a[1]=mida*1.0/midb;

	a[0]=avery-a[1]*averx;//常数,(零次项系数)
	
	return;

}

//************************************************//
//*******         基2FFT整序算法       ***********//
//名称:reoredr
//参数说明:
//x为CNumber型的时域指针
//n为变换点数,2的整数次方,如4,8,16,32......       //
//m为变换点数的2次方数
//n==2**m
//*****************                               //
//作者:柯丹
//时间:2007.11.15
//************************************************//

void CNllbfDlg::reorder(CNumber* x, int n, int m)
{
    
    //n=2**m;
	int nv2,nm1,i,j,k,sign;
	CNumber *mdata,*mdatb,*u,*w;
    mdata=new CNumber[1];
	mdatb=new CNumber[1];
	u=new CNumber[1];
	w=new CNumber[1];
	
	nv2=n/2;
	nm1=n-1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -