📄 痴迷人信号采集系统dlg.cpp
字号:
}
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 + -