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

📄 gz9.c

📁 基于数字滤波技术的系统动态特性补偿仪的程序编写
💻 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 + -