📄 prealarmdlg.cpp
字号:
SetTimer(3,1000,NULL);
}
void CPreAlarmDlg::OnSaveData()
{
// TODO: Add your control notification handler code here
m_Tw3x.DeleteAllItems();
m_Tw3y.DeleteAllItems();
m_Tw4x.DeleteAllItems();
m_Tw4y.DeleteAllItems();
k=0;
App_AddTag("W3X.Value",&m_ReadID_w3x,&m_DataType_w3x);
App_AddTag("W3Y.Value",&m_ReadID_w3y,&m_DataType_w3y);
App_AddTag("W4X.Value",&m_ReadID_w4x,&m_DataType_w4x);
App_AddTag("W4Y.Value",&m_ReadID_w4y,&m_DataType_w4y);
SetTimer(4,1000,NULL);
}
void CPreAlarmDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
BOOL bVal;
long lVal;
float fVal1,fVal2,fVal3,fVal4,fVal5,fVal6,fVal7,fVal8;
char sVal[255];
if(nIDEvent==3)
{
App_ReadTag(m_ReadID_w3x,&bVal,&lVal,&fVal1,sVal);
App_ReadTag(m_ReadID_w3y,&bVal,&lVal,&fVal2,sVal);
App_ReadTag(m_ReadID_w4x,&bVal,&lVal,&fVal3,sVal);
App_ReadTag(m_ReadID_w4y,&bVal,&lVal,&fVal4,sVal);
m_Ew3x=fVal1;
m_Ew3y=fVal2;
m_Ew4x=fVal3;
m_Ew4y=fVal4;
UpdateData(FALSE);
}
if(nIDEvent==4)
{
if(m_Tw3x.GetCount()>10)//存12个点,k=12
{
KillTimer(4);
}
App_ReadTag(m_ReadID_w3x,&bVal,&lVal,&fVal5,sVal);
App_ReadTag(m_ReadID_w3y,&bVal,&lVal,&fVal6,sVal);
App_ReadTag(m_ReadID_w4x,&bVal,&lVal,&fVal7,sVal);
App_ReadTag(m_ReadID_w4y,&bVal,&lVal,&fVal8,sVal);
W3X[k]=fVal5;
W3Y[k]=fVal6;
W4X[k]=fVal7;
W4Y[k++]=fVal8;
CString SS1,SS2,SS3,SS4;
SS1.Format("%f",fVal5);
SS2.Format("%f",fVal6);
SS3.Format("%f",fVal7);
SS4.Format("%f",fVal8);
m_Tw3x.InsertItem(SS1,TVI_ROOT,TVI_LAST );
m_Tw3y.InsertItem(SS2,TVI_ROOT,TVI_LAST );
m_Tw4x.InsertItem(SS3,TVI_ROOT,TVI_LAST );
m_Tw4y.InsertItem(SS4,TVI_ROOT,TVI_LAST );
}
if(nIDEvent==5)
{
OnFdataCurve();
if(k>11)//存12个点
{
diagnose();
KillTimer(5);
for(int j=0;j<1024;j++)
{
W3X[j]=0;
W3Y[j]=0;
W4X[j]=0;
W3Y[j]=0;
}
}
}
if(nIDEvent==10)
{
OnSaveData();
SetTimer(5,1000,NULL);
}
CDialog::OnTimer(nIDEvent);
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
//信号分析基本函数
void CPreAlarmDlg::OnTdataCurve()
{
// TODO: Add your control notification handler code here
if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1) { clf(); clf01=clf02=clf21=clf22=clf31=0;} //清除曲线
clf01=1;
//***参数设定
N=1024;
fs=500;//风机转速1000rpm =〉基频f=1000/60=>采样频率100/6*10*3=500HZ
//***选择测点
UpdateData(TRUE);
p=1;
CString str;
if(m_select.GetCurSel()!=CB_ERR)
{
m_select.GetLBText(m_select.GetCurSel(),str);
p=atoi(str.GetBuffer(0));
}
//***计算与绘图
initM(MATCOM_VERSION); //初始化matcom库函数
Mm X,Y;
X=zeros(1,N); Y=zeros(1,N);
for(int i=0;i<N;i++) {X(1,i+1)=i;};
int j;
switch (p)
{
case 1 : for(j=0;j<N;j++) {Y(1,j+1)=W3X[j];}; break;
case 2 : for(j=0;j<N;j++) {Y(1,j+1)=W3Y[j];}; break;
case 3 : for(j=0;j<N;j++) {Y(1,j+1)=W4X[j];}; break;
case 4 : for(j=0;j<N;j++) {Y(1,j+1)=W4Y[j];}; break;
}
CWnd *p1=NULL;
p1=(CWnd *)GetDlgItem(IDC_PIC); //得到用于显示图像Static text控件的ID
Mm plothandle=winaxes(p1->m_hWnd); //将Static text的句柄设置赋给画图句柄
plt(X,Y); //plot(CL(Y));
exitM(); //结束库函数的调用
}
void CPreAlarmDlg::OnFdataCurve()
{
// TODO: Add your control notification handler code here
if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1) { clf(); clf01=clf02=clf21=clf22=clf31=0;}//清除曲线
clf02=1;
//***参数设定
UpdateData(TRUE);
N=1024;
Nfft=1024;
fs=500;
//***选择测点
UpdateData(TRUE);
p=1;//为了循环显示
CString str;
if(m_select.GetCurSel()!=CB_ERR)
{
m_select.GetLBText(m_select.GetCurSel(),str);
p=atoi(str.GetBuffer(0));
}
//***计算与绘图
initM(MATCOM_VERSION); //初始化matcom库函数
Mm X,Y,NN,R,RX,RY;
X=zeros(1,N); Y=zeros(1,N);
NN=zeros(1,1);
R=zeros(1,Nfft);
RX=zeros(1,Nfft/2); RY=zeros(1,Nfft/2);
int j;
switch (p)
{
case 1 : for(j=0;j<N;j++) {Y(1,j+1)=W3X[j];}; break;
case 2 : for(j=0;j<N;j++) {Y(1,j+1)=W3Y[j];}; break;
case 3 : for(j=0;j<N;j++) {Y(1,j+1)=W4X[j];}; break;
case 4 : for(j=0;j<N;j++) {Y(1,j+1)=W4Y[j];}; break;
}
NN(1,1)=Nfft;
CWnd *p1=NULL;
p1=(CWnd *)GetDlgItem(IDC_PIC); //得到用于显示图像Static text控件的ID
Mm plothandle=winaxes(p1->m_hWnd); //将Static text的句柄设置赋给画图句柄
R=real(fft(Y,NN));
for(int k0=0;k0<Nfft/2;k0++) {RY(1,k0+1)=R(1,k0+1);};
for(int k1=0;k1<Nfft/2;k1++) {RX(1,k1+1)=k1*fs/Nfft;};
plt(RX,abs(RY)); //plot(CL(abs(RY)));
exitM(); //结束库函数的调用
}
void CPreAlarmDlg::OnCpeakValue()
{
// TODO: Add your control notification handler code here
//***参数设定
N=1024;
Nfft=1024;
F0=50/3;
fs=500;
//***选择测点
UpdateData(TRUE);
CString str;
if(m_select.GetCurSel()!=CB_ERR)
{
m_select.GetLBText(m_select.GetCurSel(),str);
p=atoi(str.GetBuffer(0));
}
//***频段参数
double f11,f12,f21,f22,f30,f41,f42,f50,f60,f71,f72,f81,f82;
int n11,n12,n21,n22,n30,n41,n42,n50,n60,n71,n72,n81,n82;
f11=0.01*F0; n11=(int)(f11*Nfft/fs+1);
f12=0.39*F0; n12=(int)(f12*Nfft/fs+1);
f21=0.40*F0; n21=(int)(f21*Nfft/fs+1);
f22=0.48*F0; n22=(int)(f22*Nfft/fs+1);
f30=0.50*F0; n30=(int)(f30*Nfft/fs+1);
f41=0.51*F0; n41=(int)(f41*Nfft/fs+1);
f42=0.99*F0; n42=(int)(f42*Nfft/fs+1);
f50=F0; n50=(int)(f50*Nfft/fs+1);
f60=2*F0; n60=(int)(f60*Nfft/fs+1);
f71=3*F0; n71=(int)(f71*Nfft/fs+1);
f72=5*F0; n72=(int)(f72*Nfft/fs+1);
f81=f72; n81=(int)(f81*Nfft/fs+1);
f82=fs/2; n82=(int)(f82*Nfft/fs);
//***峰值计算
initM(MATCOM_VERSION); //初始化matcom库函数
Mm X,Y,NN,R,RX,RY;
X=zeros(1,N); Y=zeros(1,N);
NN=zeros(1,1);
R=zeros(1,Nfft);
RX=zeros(1,Nfft/2); RY=zeros(1,Nfft/2);
int j;
switch (p)
{
case 1 : for(j=0;j<N;j++) {Y(1,j+1)=W3X[j];}; break;
case 2 : for(j=0;j<N;j++) {Y(1,j+1)=W3Y[j];}; break;
case 3 : for(j=0;j<N;j++) {Y(1,j+1)=W4X[j];}; break;
case 4 : for(j=0;j<N;j++) {Y(1,j+1)=W4Y[j];}; break;
}
NN(1,1)=Nfft;
R=real(fft(Y,NN));
for(int k0=0;k0<Nfft/2;k0++) {RY(1,k0+1)=R(1,k0+1);};
for(int k1=0;k1<Nfft/2;k1++) {RX(1,k1+1)=k1*fs/Nfft;};
Mm RY1,RY2,RY3,RY4,RY5,RY6,RY7,RY8; //存储每个频段值
RY1=zeros(1,n12-n11+1); for(int p1=0;p1<n12-n11+1;p1++) {RY1(1,p1+1)=RY(1,n11+p1);};
RY2=zeros(1,n22-n21+1); for(int p2=0;p2<n22-n21+1;p2++) {RY2(1,p2+1)=RY(1,n21+p2);};
RY3=zeros(1,n30-n30+1); RY3(1,1)=RY(n30);
RY4=zeros(1,n42-n41+1); for(int p4=0;p4<n42-n41+1;p4++) {RY4(1,p4+1)=RY(1,n41+p4);};
RY5=zeros(1,n50-n50+1); RY5(1,1)=RY(n50);
RY6=zeros(1,n60-n60+1); RY6(1,1)=RY(n60);
RY7=zeros(1,n72-n71+1); for(int p7=0;p7<n72-n71+1;p7++) {RY7(1,p7+1)=RY(1,n71+p7);};
RY8=zeros(1,n82-n81+1); for(int p8=0;p8<n82-n81+1;p8++) {RY8(1,p8+1)=RY(1,n81+p8);};
//***峰值输出
Pvalue[0]=max(abs(RY1)).r(1,1);m_value01=(float)Pvalue[0];
Pvalue[1]=max(abs(RY2)).r(1,1);m_value02=(float)Pvalue[1];
Pvalue[2]=abs(RY3).r(1,1); m_value03=(float)Pvalue[2];
Pvalue[3]=max(abs(RY4)).r(1,1);m_value04=(float)Pvalue[3];
Pvalue[4]=abs(RY5).r(1,1); m_value05=(float)Pvalue[4];
Pvalue[5]=abs(RY6).r(1,1); m_value06=(float)Pvalue[5];
Pvalue[6]=max(abs(RY7)).r(1,1);m_value07=(float)Pvalue[6];
Pvalue[7]=max(abs(RY8)).r(1,1);m_value08=(float)Pvalue[7];
UpdateData(FALSE);
exitM(); //结束库函数的调用
}
void CPreAlarmDlg::OnSubjection()
{
// TODO: Add your control notification handler code here
//***隶属度计算
double X,K,P[8];
X=Pvalue[0]+Pvalue[1]+Pvalue[2]+Pvalue[3]+Pvalue[4]+Pvalue[5]+Pvalue[6]+Pvalue[7];
K=1/((X*X/64));
for(int i=0;i<8;i++)
{
P[i]=K*Pvalue[i]*Pvalue[i];
Svalue[i]=P[i]/(1+P[i]);
}
//***隶属度输出
m_value01=(float)Svalue[0];
m_value02=(float)Svalue[1];
m_value03=(float)Svalue[2];
m_value04=(float)Svalue[3];
m_value05=(float)Svalue[4];
m_value06=(float)Svalue[5];
m_value07=(float)Svalue[6];
m_value08=(float)Svalue[7];
UpdateData(FALSE);
}
void CPreAlarmDlg::OnCurveClear()
{
// TODO: Add your control notification handler code here
if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1) { clf(); clf01=clf02=clf21=clf22=clf31=0;} //清除曲线
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//BP 分析基本函数
void CPreAlarmDlg::OnBPTrain()
{
// TODO: Add your control notification handler code here
Ns=8;
UpdateData(TRUE);
N_Err=15000;
error_accept=m_alloweer;
learnspeed=m_speed;
cretwb();
int i,current=0,loops=0,trainok=0;
double* temp[15];
int mark[50]; //**训练成功标志,最多50个样本
for(i=0;i<N_Err;i++) numE[i]=0;
for(i=0;i<Ns;i++) mark[i]=0;
initwb();
step2:
loadwb(); //**将final赋值给新分配内存空间的W1,W2,B1,B2
current=loops%(Ns);
P=P_sample[current];T=T_output[current];
//**计算正向传播信息
N1=MatrixAdd((temp[0]=MatrixMul(W1,P,s1,r,1)),B1,s1,1); //N1: s1×1
A1=f1(N1,s1);
N2=MatrixAdd((temp[1]=MatrixMul(W2,A1,s2,s1,1)),B2,s2,1);//N2: s2×1
A2=f2(N2,s2);
//**计算反向传播误差
E=MatrixSub(T,A2,s2,1); //T、A2、E为s2×1
numE[loops]=0;
for(i=0;i<s2;i++)numE[loops]=numE[loops]+E[i]*E[i];
//**计算S2、S1
S2=MatrixMulNum((temp[3]=MatrixMul((temp[2]=F2(N2,s2)),E,s2,s2,1)),s2,1,-2.0);
S1=MatrixMul(temp[6]=(MatrixMul((temp[4]=F1(N1,s1)),(temp[5]=MatrixInver(W2,s2,s1)),s1,s1,s2)),S2,s1,s2,1);
//**调整输出层神经元的权值和偏置
dW2=MatrixMul(S2,(temp[7]=MatrixInver(A1,s1,1)),s2,1,s1); //dW2: s2×s1
dW2=MatrixMulNum((temp[8]=dW2),s2,s1,-learnspeed);
W2=MatrixAdd((temp[9]=W2),dW2,s2,s1);
dB2=MatrixMulNum(S2,s2,1,-learnspeed);
B2=MatrixAdd((temp[10]=B2),dB2,s2,1);
//**调整隐层神经元权值和偏置
dW1=MatrixMul(S1,(temp[11]=MatrixInver(P,r,1)),s1,1,r); //dW1: s1×r
dW1=MatrixMulNum((temp[12]=dW1),s1,r,-learnspeed);
W1=MatrixAdd((temp[13]=W1),dW1,s1,r);
dB1=MatrixMulNum(S1,s1,1,-learnspeed);
B1=MatrixAdd((temp[14]=B1),dB1,s1,1);
savewb();
//**释放动态分配的内存区
free(W1);free(B1);free(N1);free(A1);free(dW1);free(dB1);free(S1);
free(W2);free(B2);free(N2);free(A2);free(dW2);free(dB2);free(S2);
for(i=0;i<15;i++) free(temp[i]);
//**条件判断
if(loops>N_Err) goto step3;
if(numE[loops]>error_accept) //误差大小判断
{ mark[current]=0;
++loops; goto step2;
}
else mark[current]=1; //误差符合要求,成功一次
trainok=0;
for(i=0;i<Ns;i++) trainok+=mark[i]; //循环次数判断
if(trainok>=Ns){ goto step3;}
else { ++loops; goto step2;}
step3:
learncount=loops-1;
m_eer=numE[learncount];
UpdateData(FALSE);
}
void CPreAlarmDlg::OnBPEerPic()
{
// TODO: Add your control notification handler code here
if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1) { clf(); clf01=clf02=clf21=clf22=clf31=0;}//清除曲线
clf22=1;
initM(MATCOM_VERSION); //初始化matcom库函数
Mm X,Y;
X=zeros(1,learncount);
Y=zeros(1,learncount);
for(int i=0;i<learncount;i++) {X(1,i+1)=i;};
for(int j=0;j<learncount;j++) {Y(1,j+1)=numE[j];};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -