📄 gz9.c
字号:
#include<formatio.h>
#include<ansi_c.h>
#include<analysis.h>
#include<cvirte.h>
#include<userint.h>
#include "GZ9.h"
static int panel;
static int sysorder=0;
static double ts;
static double wn;
static double damp;
static double timeparam;
static int number;
static double *H;
static double *step;
static double *AH;
static double A;
static int inputtype;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panel = LoadPanel (0, "GZ9.uir",PANEL_13)) < 0)
return -1;
DisplayPanel (panel);
RunUserInterface ();
DiscardPanel (panel);
return 0;
}
/*采用后向差分法实现的数字滤波器对频带进行扩*/
void buchang(void)
{
int i;
double b,c,awn,adamp;
double b0,b1,b2,a1,a2,P;
double a;
if(sysorder==0)
{
c=1/timeparam;
b=A*c;
P=1/(1+b*ts);
b0=A*(1+c*ts);
b1=-A;
a1=1;
AH[0]=P*b0*H[0];
for(i=1;i<number;i++)
AH[i]=P*(b0*H[i]+b1*H[i-1]+a1*AH[i-1]);
i=0;
}
else
{
awn=wn*A;
adamp=0.7;
P=1/(1/(awn*awn*ts*ts)+2*adamp/(awn*ts)+1);
b0=1/(wn*wn*ts*ts)+2*damp/(wn*ts)+1;
b1=-(2/(wn*wn*ts*ts)+2*damp/(wn*ts));
b2=1/(wn*wn*ts*ts);
a1=-(2/(awn*awn*ts*ts)+2*adamp/(awn*ts));
a2=1/(awn*awn*ts*ts);
AH[0]=P*b0*H[0];
AH[1]=P*(b0*H[1]+b1*H[0]-a1*AH[0]);
AH[2]=P*(b0*H[2]+b1*H[1]+b2*H[2]-a1*AH[1]-a2*AH[0]);
for(i=3;i<number;i++)
AH[i]=P*(b0*H[i]+b1*H[i-1]+b2*H[i-2]-a1*AH[i-1]-a2*AH[i-2]);
}
SetCtrlVal(panel,PANEL_13_DRAW,1);
DeleteGraphPlot(panel,PANEL_13_SIGGRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotY(panel,PANEL_13_SIGGRAPH,AH,number,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_YELLOW);
}
/*补偿前系统的阶跃响应*/
int CVICALLBACK PampRspon (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double k;
int i;
double M0,M1,M2,M3;
double a;
switch(event)
{
case EVENT_COMMIT:
GetCtrlVal(panel,PANEL_13_TS,&ts);
switch(sysorder)
{
case 0:
GetCtrlVal(panel,PANEL_13_K,&k);
GetCtrlVal(panel,PANEL_13_TIMEPARAM,&timeparam);
number=1.5*10*timeparam/ts;
step=malloc(number*sizeof(double));
step[0]=0;
for(i=1;i<number;i++)
step[i]=1;
H=malloc(number*sizeof(double));
H[0]=k*ts/(timeparam+ts)*step[0];
for(i=1;i<number;i++)
H[i]=k*ts/(timeparam+ts)*step[i]+timeparam/(timeparam+ts)*H[i-1];
break;
case 1:
GetCtrlVal(panel,PANEL_13_WN,&wn);
GetCtrlVal(panel,PANEL_13_DAMP,&damp);
GetCtrlVal(panel,PANEL_13_K,&k);
number=10*1.5/wn/damp/ts;
step=malloc(number*sizeof(double));
step[0]=0;
for(i=1;i<number;i++)
step[i]=1;
H=malloc(number*sizeof(double));
M0=4+4*wn*damp*ts+wn*wn*ts*ts;
M1=-8+2*wn*wn*ts*ts;
M2=4-4*damp*wn*ts+wn*wn*ts*ts;
M3=k*ts*ts*wn*wn;
H[0]=0;
H[1]=-M1*H[0]/M0+M3*H[1]/M0+M3*2*step[0]/M0;
for(i=2;i<number;i++)
H[i]=M1/M0*H[i-1]-M2/M0*H[i-2]+M3/M0*step[i]+2*M3/M0*step[i-1]+M3/M0*step[i-2];
break;
}
DeleteGraphPlot(panel,PANEL_13_SIGGRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotY(panel,PANEL_13_SIGGRAPH,H,number,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);
break;
}
return 0;
}
int CVICALLBACK Draw (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int sigtype;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panel,PANEL_13_DRAW,&sigtype);
switch(sigtype)
{
case 0:
DeleteGraphPlot(panel,PANEL_13_SIGGRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotY(panel,PANEL_13_SIGGRAPH,H,number,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);
break;
case 1:
if(AH==NULL)
{
MessagePopup("Warn","Data cann't be null!");
return 0;
}
DeleteGraphPlot(panel,PANEL_13_SIGGRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotY(panel,PANEL_13_SIGGRAPH,AH,number,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_YELLOW);
break;
case 2:
if(AH==NULL||H==NULL)
{
MessagePopup("Warn","Data cann't be null!");
return 0;
}
DeleteGraphPlot(panel,PANEL_13_SIGGRAPH,-1,VAL_IMMEDIATE_DRAW);
PlotY(panel,PANEL_13_SIGGRAPH,AH,number,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_YELLOW);
PlotY(panel,PANEL_13_SIGGRAPH,H,number,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);
break;
}
break;
}
return 0;
}
int CVICALLBACK Sysorder (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
switch(sysorder)
{
case 0:
SetCtrlAttribute(panel,PANEL_13_TIMEPARAM,ATTR_DIMMED,0);
SetCtrlAttribute(panel,PANEL_13_K,ATTR_DIMMED,0);
SetCtrlAttribute(panel,PANEL_13_WN,ATTR_DIMMED,1);
SetCtrlAttribute(panel,PANEL_13_DAMP,ATTR_DIMMED,1);
break;
case 1:
SetCtrlAttribute(panel,PANEL_13_WN,ATTR_DIMMED,0);
SetCtrlAttribute(panel,PANEL_13_DAMP,ATTR_DIMMED,0);
SetCtrlAttribute(panel,PANEL_13_K,ATTR_DIMMED,0);
SetCtrlAttribute(panel,PANEL_13_TIMEPARAM,ATTR_DIMMED,0);
break;
}
break;
}
return 0;
}
int CVICALLBACK ARspon (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panel,PANEL_13_A,&A);
AH=malloc(number*sizeof(double));
buchang();
break;
}
return 0;
}
int CVICALLBACK Close (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
QuitUserInterface(0);
free(H);
free(step);
free(AH);
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -