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

📄 痴迷人信号采集系统dlg.cpp

📁 这个软件要配合采集卡一起使用的。通过传感器可以采集各类的信号。如果您的专业有涉及到
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}

void CMyDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	if(m_bIsStarted){
		husb=OpenUA300();
		if(husb==NULL){
			CloseUA300(husb);
			m_bIsDrawGraph=false;
			KillTimer(1);
			::EnableWindow(m_btLoad,true);
			::EnableWindow(m_btFFT,false);
			MessageBox("未发现UA302H型A/D采集器!");
			return;
		}
		minit(husb,0,m_iChanels,0);
		readdata(husb,addat,6000000/m_uRate,m_iChanels*SCANCOUNT);
		DrawGraph();
		CloseUA300(husb);
	}

	CDialog::OnTimer(nIDEvent);
}

void CMyDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	m_bIsStarted = false;
	::EnableWindow(m_btLoad,true);
	KillTimer(1);	
}

void CMyDlg::OnAbout()
{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
}

void CMyDlg::DrawGraph()
{
	int i=0;
	CClientDC dc(this);
	dc.SelectObject(hBlackBrush);
	if(m_iChanels==1)
	{
			
		dc.Rectangle(&rectArea1);
		dc.IntersectClipRect(&rectArea1);
		dc.SelectObject(hYellowPen);
		dc.MoveTo(rectArea1.left,(rectArea1.top+rectArea1.bottom)/2);
		dc.LineTo(rectArea1.right,(rectArea1.top+rectArea1.bottom)/2);
		dc.SelectObject(hRedPen);
		for (i=1; i<SCANCOUNT/2; ) {
			short int adinput;
			int newx,newy,oldx,oldy;
			adinput = addat[i];
			newy = (rectArea1.top+rectArea1.bottom)/2-(int)(adinput*(0.00030518)*(rectArea1.bottom-rectArea1.top)/m_fVolt);
			newx = (rectArea1.left)+i;

			if (i==1)
				dc.MoveTo(newx, newy);
			else
				dc.MoveTo(oldx, oldy);
			dc.LineTo(newx, newy);
			oldx = newx;
			oldy = newy;
			i+=1;
			if(oldx>=(int)(rectArea1.right-1))
				break;
		}		
		dc.SelectClipRgn(NULL);	
	}
	if(m_iChanels==2)
	{	
		dc.Rectangle(&rectArea1);	
		dc.Rectangle(&rectArea3);
		dc.SelectObject(hYellowPen);
		dc.MoveTo(rectArea1.left,(rectArea1.top+rectArea1.bottom)/2);
		dc.LineTo(rectArea1.right,(rectArea1.top+rectArea1.bottom)/2);
		dc.MoveTo(rectArea3.left,(rectArea3.top+rectArea3.bottom)/2);
		dc.LineTo(rectArea3.right,(rectArea3.top+rectArea3.bottom)/2);
		dc.SelectObject(hRedPen);
		
		dc.IntersectClipRect(&rectArea1);
		for (i=0; i<SCANCOUNT; ) {
			short int adinput;
			int newx,newy,oldx,oldy;
			adinput = addat[i];
			newy = (rectArea1.top+rectArea1.bottom)/2-(int)(adinput*(0.00030518)*(rectArea1.bottom-rectArea1.top)/m_fVolt);
			newx = (rectArea1.left)+i;	

			if (i==0)
				dc.MoveTo(newx, newy);
			else
				dc.MoveTo(oldx, oldy);
			dc.LineTo(newx, newy);
			oldx = newx;
			oldy = newy;
			i+=2;
			if(oldx>=(int)(rectArea1.right-1))
				break;
		}

		dc.SelectClipRgn(NULL);
		dc.IntersectClipRect(&rectArea3);
		for (i=1; i<SCANCOUNT; ) {
			short int adinput;
			int newx,newy,oldx,oldy;
			adinput = addat[i];
			newy = (rectArea3.top+rectArea3.bottom)/2-(int)(adinput*(0.00030518)*(rectArea3.bottom-rectArea3.top)/m_fVolt);
			newx = (rectArea3.left)+i;
			
			if (i==1)
				dc.MoveTo(newx, newy);
			else
				dc.MoveTo(oldx, oldy);
			dc.LineTo(newx, newy);
			oldx = newx;
			oldy = newy;
			i+=2;
			if(oldx>=(int)(rectArea3.right-2))
				break;
		}		
		dc.SelectClipRgn(NULL);
	}

}

void CMyDlg::OnMinimize() 
{
	ShowWindow(SW_HIDE);
	m_bMinimize	= true;
}

void CMyDlg::OnSave() 
{

	CString Filter;
	Filter = "Signal Files (*.txt)|*.txt||";

	CFileDialog FileDlg (FALSE, NULL, NULL, OFN_OVERWRITEPROMPT, Filter);
	FileDlg.m_ofn.lpstrDefExt="txt";
	if(FileDlg.DoModal()==IDOK)
	{
		fstream outfile;
		outfile.open(FileDlg.GetPathName(),ios::out);

		if(!outfile)
		{
			MessageBox("保存信号失败!","错误");
			return;
		}
		
		unsigned int i=0; 
		if(m_iChanels==1)
		{
			outfile<<"采样通道(个):\t1\n";
			outfile<<"采样点数(点):\t"<<SCANCOUNT<<"\n";
			outfile<<"采样频率(HZ):\t"<<m_uRate<<"\n";
			outfile<<"通道1\n";
			for(i=0;i<SCANCOUNT;i++)
				outfile<<addat[i]<<"\n";
		}
		if(m_iChanels==2)
		{
			outfile<<"采样通道(个):\t2\n";
			outfile<<"采样点数(点):\t"<<SCANCOUNT<<"\n";
			outfile<<"采样频率(HZ):\t"<<m_uRate<<"\n";
			outfile<<"通道1\t通道2\n";
			for(i=0;i<SCANCOUNT;i++)
				outfile<<addat[2*i]<<"\t"<<addat[2*i+1]<<"\n";
		}
		outfile.close();

	}

}

void CMyDlg::OnLoad() 
{
	CString Filter;
	Filter = "Signal Files (*.txt)|*.txt||";

	CFileDialog FileDlg (TRUE, NULL, NULL, OFN_OVERWRITEPROMPT, Filter);
	FileDlg.m_ofn.lpstrDefExt="txt";
	if(FileDlg.DoModal()==IDOK)
	{
		unsigned int i=0; 
		fstream infile;
		infile.open(FileDlg.GetPathName(),ios::in);
		if(!infile)
		{
			MessageBox("加载信号失败!","错误");
			DrawArea();
			return;
		}
		char s[50];
		CString TempRbuffer;
		infile.getline(s,sizeof(s));
		TempRbuffer=s;
		m_iChanels=atoi(TempRbuffer.Mid(TempRbuffer.Find("	")));	
		if(m_iChanels!=1 && m_iChanels!=2)
		{
			m_iChanels=1;
			m_bIsDrawGraph=false;
			m_bIsDrawFFT=false;
			DrawArea();
			MessageBox("加载信号失败!请检查数据格式是否正确!","错误");
			return;
		}
		infile.getline(s,sizeof(s));
		infile.getline(s,sizeof(s));
		TempRbuffer=s;
		m_uRate=atoi(TempRbuffer.Mid(TempRbuffer.Find("	")));
		
		int m_iRate;
		switch(m_uRate)
		{
		case 10000:
			m_iRate=0;
			break;
		case 20000:
			m_iRate=1;
			break;		
		case 30000:
			m_iRate=2;
			break;
		case 40000:
			m_iRate=3;
			break;			
		case 50000:
			m_iRate=4;
			break;
		case 60000:
			m_iRate=5;
			break;
		case 70000:
			m_iRate=6;
			break;
		case 80000:
			m_iRate=7;
			break;
		case 90000:
			m_iRate=8;
			break;
		case 100000:
			m_iRate=9;
			break;
		case 110000:
			m_iRate=10;
			break;
		case 120000:
			m_iRate=11;
			break;
		case 130000:
			m_iRate=12;
			break;
		case 140000:
			m_iRate=13;
			break;
		case 150000:
			m_iRate=14;
			break;
		case 160000:
			m_iRate=15;
			break;
		case 170000:
			m_iRate=16;
			break;
		case 180000:
			m_iRate=17;
			break;
		case 190000:
			m_iRate=18;
			break;
		case 200000:
			m_iRate=19;
			break;
		default:
			m_iRate=-1;
		}
		if(m_iRate==-1)
		{
			m_uRate=50000;
			m_combRate.SetCurSel(4);
			m_bIsDrawGraph=false;
			m_bIsDrawFFT=false;
			DrawArea();			
			MessageBox("数据采样频率有误!\n请检查保存格式和范围是否正确!","加载信号错误");
			return;
		}
		m_combRate.SetCurSel(m_iRate);	
		infile.getline(s,sizeof(s));			
		if(m_iChanels==1)
		{
			while(!infile.eof())
			{
				infile.getline(s,sizeof(s));
				TempRbuffer=s;
				addat[i++]=atoi(TempRbuffer);
			}
		}
		if(m_iChanels==2)
		{
			while(!infile.eof())
			{
				infile.getline(s,sizeof(s));
				TempRbuffer=s;
				addat[i++]=atoi(TempRbuffer.Left(TempRbuffer.Find("	")));
				addat[i++]=atoi(TempRbuffer.Mid(TempRbuffer.Find("	")));
			}
		}
		infile.close();

		m_bIsDrawGraph=true;
		m_bIsDrawFFT=false;		
		::EnableWindow(m_btFFT,true);
		DrawArea();
		DrawGraph();

	}
	
}

void CMyDlg::OnFft() 
{
	// TODO: Add your control notification handler code here

	if(!m_bIsDrawGraph)
		return;
	int i=0;
	m_bIsDrawFFT=true;
	for(i=0;i<SCANCOUNT;i++)
	{
		fftout[i]=0;
		fftout1[i]=0;
	}
	if(m_iChanels==1)
	{
		for(i=0;i<SCANCOUNT;i++)
		{
			fftin[i]=addat[i];
		}
		FFT(fftin,fftout,10);	
	}
	if(m_iChanels==2)
	{
		for(i=0;i<SCANCOUNT;i++)
		{
			fftin[i]=addat[2*i];
		}
		FFT(fftin,fftout,10);
		for(i=0;i<SCANCOUNT;i++)
		{
			fftin1[i]=addat[2*i+1];
		}
		FFT(fftin1,fftout1,10);
	}
	DrawFFT();
}


void CMyDlg::FFT(Complex *TD, Complex *FD, int r)
{ 

	int   count;   
    int   i,j,k,bfsize,p;   
    double   angle;   
        Complex *W,*X1,*X2,*X;   
        count=1<<r;   
        W=new   Complex[count/2];   
        X1=new   Complex[count];   
        X2=new   Complex[count];   
        for(i=0;i<count/2;i++)   
        {   
              angle=-i*PI*2/count;   
              W[i]=Complex(cos(angle),sin(angle));   
        }   
        memcpy(X1,TD,sizeof(Complex)*count);   
        for(k=0;k<r;k++)   
        {   
                for(j=0;j<1<<k;j++)   
                {   
                      bfsize=1<<(r-k);   
                      for(i=0;i<bfsize/2;i++)   
                      {   
                            p=j*bfsize;   
                            X2[i+p]=X1[i+p]+X1[i+p+bfsize/2];   
                            X2[i+p+bfsize/2]=(X1[i+p]-X1[i+p+bfsize/2])*W[i*(1<<k)];   
                      }   
                }   
                X=X1;   
                X1=X2;   
                X2=X;   
        }   
        for(j=0;j<count;j++)   
        {   
              p=0;   

⌨️ 快捷键说明

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