📄 arpara.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 (¶[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 + -