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

📄 arpara.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 C
字号:
#include <ansi_c.h>
#include <analysis.h>
#include <cvirte.h>		
#include <userint.h>
#include "arpara.h"

//函数声明
int CalculateAR(double *X,int rank,int length,double *Y,double *fai);
int CalculateARVar(double *data,int length, double *para, 
                   int rank, double *var,double *ar);
                   
//定义变量
static int panelHandle;
int rank;
double *para;
double var;

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	
	if ((panelHandle = LoadPanel (0, "arpara.uir", PANEL)) < 0)
		return -1;
	DisplayPanel (panelHandle);
	RunUserInterface ();
	return 0;
}

int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_CLOSE:
			QuitUserInterface (0);
			break;
		}
	return 0;
}

int CVICALLBACK SaveParaMeter (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
    //定义变量
    int status,i;
    char filename[MAX_PATHNAME_LEN];
  	FILE* fp;
  	
	switch (event)
		{
		case EVENT_COMMIT:
		    //打开文件选择框
		    status = FileSelectPopup ("", "*.arp", "*.arp", "Open file",
									 VAL_SAVE_BUTTON, 0, 0, 1, 0, filename);
	        if ((status <0)||(status==0))  
	              return -1;
	             
			//打开文件并写入时序模型参数
			fp = fopen (filename, "wt");
			fwrite (&rank, sizeof(int), 1, fp);
			for(i=0;i<rank;i++)
			{
			fwrite (&para[i], sizeof(double), 1, fp);
			}
			fwrite (&var, sizeof(double), 1, fp);
			fclose (fp);

			break;
		}
	return 0;
}

int CVICALLBACK ReadDataCllback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
    //定义变量
    int status,i,j,length,samplerate;
    char filename[MAX_PATHNAME_LEN];
	FILE* fp;
	double *data;
	double *yVec,*xMat,*temp;
	
	switch (event)
		{
		case EVENT_COMMIT:
			//获取控件RANK控件的值
			GetCtrlVal (panel, PANEL_RANK, &rank);
			
			//分配内存空间
			if(para==NULL)
			   para=malloc(sizeof(double)*rank);
			else
			   para = realloc (para, sizeof(double)*rank);
			   
		    //打开文件选择框
		   status = FileSelectPopup ("", "*.bfd", "*.bfd",
									 "Open file", VAL_LOAD_BUTTON, 0, 0, 1, 0,
									 filename);
	       if ((status <0)||(status==0))  
	             return -1;
	       
			//打开文件并写入时序模型参数
           fp = fopen (filename, "rt");
           if(fp==NULL) break;
		   fread (&length, sizeof(int), 1, fp);
		   fread (&samplerate, sizeof(int), 1, fp);
		      data=malloc(sizeof(double)*length);
		   fread (data, sizeof(double), length, fp);
		   fclose (fp);

		   //分配内存空间
		   yVec=(double *)malloc(sizeof(double)*(length-rank));
		   xMat=(double *)malloc(sizeof(double)*rank*(length-rank));
		   
		   //为yVec变量幅值
		   for(i=0;i<length-rank;i++)
		     yVec[i] = data[rank+i];
		   
		   //为xMat变量幅值
		   for(i=0;i<length-rank;i++)
    	      for(j=0;j<rank;j++)
    	      xMat[i*rank+j] = data[rank+i-j-1];
		   
		   //计算时序模型参数
		   CalculateAR(xMat,rank,length,yVec,para);
		    
		   //分配内存空间
		   temp=(double *)malloc(sizeof(double)*length);
		   
		   //计算时序模型残差
		   CalculateARVar(data,length, para, rank, &var, temp);
		    
		   DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);
		   PlotWaveform (panelHandle, PANEL_GRAPH, temp, length, VAL_DOUBLE, 1.0,
						  0.0, 0.0, 1, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID,
						  1, VAL_BLACK);
		    
		   //释放内存
		   free(data);
		   free(yVec);
		   free(xMat);
		   free(temp);


			break;
		}
	return 0;
}

int CVICALLBACK QuitCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
			QuitUserInterface (0);
			break;
		}
	return 0;
}

int CalculateAR(double *X,  int rank,  int length,  double *Y,  double *fai)
{
   //定义变量
   int status;
   double *Temp1,*Temp2,*Temp3,*Temp4;
   
   //为指针赋空
   Temp1=NULL;
   Temp2=NULL;
   Temp3=NULL;
   Temp4=NULL;
   
   //为temp1分配空间用以储存X矩阵的转置矩阵
   Temp1=(double *)malloc(sizeof(double)*rank*(length-rank));
   if(Temp1==NULL)  return -1;
   
   //将矩阵转置并将结果储存到Temp1
   status=Transpose (X, length-rank, rank, Temp1);
   if(status!=NoAnlysErr)   return -2; 
   
   //为temp2分配空间用以储存矩阵X和矩阵Temp1的乘积
   Temp2=(double *)malloc(sizeof(double)*rank*rank);
   if(Temp2==NULL)  return -1;
   
   //将矩阵X与矩阵Temp1相乘并将结果储存到Temp2
   status=MatrixMul (Temp1, X, rank, length-rank, rank, Temp2);
   if(status!=NoAnlysErr)   return -2; 
   
   //为Temp3分配空间用以储存Temp2矩阵的逆矩阵
   Temp3=(double *)malloc(sizeof(double)*rank*rank);
   if(Temp3==NULL)  return -1;
   
   //对矩阵Temp2求逆并将结果储存到Temp3
   status=InvMatrix (Temp2, rank, Temp3);
   if(status!=NoAnlysErr)   return -2; 
   
   //释放内存Temp2
   free(Temp2);
   
   //为Temp4分配空间用以储存Temp3矩阵与Temp1矩阵的乘积
   Temp4=(double *)malloc(sizeof(double)*rank*(length-rank));
   if(Temp4==NULL)  return -1;
   
   //将矩阵Temp3与矩阵Temp1相乘并将结果储存到Temp4
   status=MatrixMul (Temp3, Temp1, rank, rank, length-rank, Temp4);
   if(status!=NoAnlysErr)   return -2; 
   
   //释放内存Temp1和Temp3
   free(Temp1);
   free(Temp3);
   
   //将矩阵Temp4与行列式Y相乘并将结果储存到fai
   status=MatrixMul (Temp4, Y, rank, length-rank, 1, fai);
   if(status!=NoAnlysErr)   return -2; 
   
   //释放内存Temp1和Temp3
   free(Temp4);
   return 1;
} 


//计算时序模型及其残差
int CalculateARVar(double *data,int length, double *para, 
                   int rank, double *var,double *ar)
{
    //定义变量
    int i,j;
    double *diff,mean;
    
    //分配内存空间
    diff=malloc(sizeof(double)*length);
    
    //计算时序模型
    for(i=0;i<rank;i++)
      ar[i]=data[i];
    for(i=rank;i<length;i++)
    {  ar[i]=0;
       for(j=0;j<rank;j++)
       ar[i]=ar[i-rank+j]*para[j]+ar[i];
    }
    
    //计算残差
    for(i=0;i<length;i++)
      diff[i]=data[i]-ar[i];
    StdDev (diff, length, &mean, var);
    
    //释放内存
    free(diff);
    return 0;
}

⌨️ 快捷键说明

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