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

📄 unit1.cpp

📁 此代码采用C++Builder 编写,提取断路器电流信号的特征
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
#include<math.h>
#include<stdio.h>
#include<malloc.h>
#include <vcl.h>
#pragma hdrstop
#define DATALEN 512
//#define STAGE 8
#define app_level 6
#define det_level 3
#define stair 2//与断路器的类型有关

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float far data[8][512];//数据数组    注意此处有改动
float far dataex[8][512];
float h1[30];//滤波器系数
float far hhh[512]; //存放H滤波器数值的指针   改为数组
float far ggg[512]; // 存放G滤波器数值的指针  改为数组
int filterlen;//滤波器长度
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClick(TObject *Sender)
{
  void gethdata() ;
  void getdata1(int DATA);
  void getdata2(int DATA);
  float hh(int i,int m) ;
  float gg(int i,int m);
  void hhh1(int level);
  void ggg1(int level);
  void codeh(int level,int flen,int start,int len);
  void codeg(int level,int flen,int start,int len);
  void stagek2(int level,int flen ) ;
  void de2composek(int STAGE);  //已删除原程序中的量化部分
 //声明所有正变换函数
 void chuli(float);
 void codehrec(int level,int flen,int len);
 void codegrec(int level,int flen,int len);
 void rec(int STAGE);
 int tipan(int ,int ,int );
 int Maxzhi(int ,int,int );
  
//-------------对行程信号进行小波滤波并输出滤波后的信号-------------------------

  int i ,STAGE1=3;
  int j,k,LX,level,KL;
  gethdata();
  getdata2(DATALEN);
  de2composek(STAGE1);//小波变换部分
  for(level=STAGE1-1;level>0;level--)
  {
    LX=DATALEN/pow(2,level);
     for(i=0;i<pow(2,9-level);i++)
       data[level][LX+i]=0;
  }
  rec(STAGE1);
  Canvas->MoveTo(20,0);
  Canvas->LineTo(20,160);
  Canvas->LineTo(532,160);//画出坐标轴;
  for(i=0;i<=10;i++)
  Canvas->TextOut(20+50*i,162,50*i);
  for(i=1;i<=8;i++)
  Canvas->TextOut(0,160-20*i,20*i); //标出横纵刻度;
  float x1[512],p_x1,p_y1;
  for(i=0;i<512;i++)
    x1[i]=i;
    Canvas->MoveTo(20,160);
    for(i=0;i<512;i++)
    {
      p_x1=x1[i]+20;
      p_y1=-data[0][i]+160; //坐标转换;
      Canvas->LineTo(p_x1,p_y1);
    }   //画出滤波后行程信号波形
    float y[512];//将行程信号存在y数组中
    for(i=0;i<512;i++)
    y[i]=data[0][i];

//------------对电流信号进行小波滤波并输出滤波后的信号--------------------------
getdata1(DATALEN);
de2composek(STAGE1);//小波变换部分
for(level=STAGE1-1;level>0;level--)
  {
    LX=DATALEN/pow(2,level);
     for(i=0;i<pow(2,9-level);i++)
       data[level][LX+i]=0;
  }
  rec(STAGE1);
 Canvas->MoveTo(20,180);
  Canvas->LineTo(20,340);
  Canvas->LineTo(532,340);//画出坐标轴;
  for(i=0;i<=10;i++)
  Canvas->TextOut(20+50*i,342,50*i);
  for(i=1;i<=8;i++)
  Canvas->TextOut(0,340-20*i,20*i); //标出横纵刻度;
  float x2[512],p_x2,p_y2;
  for(i=0;i<512;i++)
    x2[i]=i;
    Canvas->MoveTo(20,340);
    for(i=0;i<512;i++)
    {
      p_x2=x2[i]+20;
      p_y2=-data[0][i]+340; //坐标转换;
      Canvas->LineTo(p_x2,p_y2);
    }   //画出滤波后电流信号波形
//------------------------------------------------------------------------------
 Canvas->MoveTo(20,360);
  Canvas->LineTo(20,400);
  Canvas->LineTo(532,400);
  for(i=0;i<=5;i++)
  Canvas->TextOut(20+100*i,402,100*i);
  Canvas->TextOut(0,360,40); //标出横纵刻度;
  float xa[512],p_xa;
  float ya[512],p_ya;
  FILE *fpa;
  char *file_namea="e:/测试信号/A相.txt";
  fpa=fopen(file_namea,"r");
  for(i=0;i<512;i++)
  fscanf(fpa,"%f",&ya[i]);
  fclose(fpa); //从文件中读出数据,将其赋给数组ya[];
  for(i=0;i<512;i++)
    xa[i]=i;
    Canvas->MoveTo(20,400);
    for(i=0;i<512;i++)
    {
      p_xa=xa[i]+20;
      p_ya=-ya[i]+400; //坐标转换;
      Canvas->LineTo(p_xa,p_ya);
    }

  Canvas->MoveTo(20,410);
  Canvas->LineTo(20,450);
  Canvas->LineTo(532,450); // 画出B相端口信号
  for(i=0;i<=5;i++)
  Canvas->TextOut(20+100*i,452,100*i);
  Canvas->TextOut(0,410,40); //标出横纵刻度;
  float xb[512],p_xb;
  float yb[512],p_yb;
  FILE *fpb;
  char *file_nameb="e:/测试信号/B相.txt";
  fpb=fopen(file_nameb,"r");
  for(i=0;i<512;i++)
  fscanf(fpb,"%f",&yb[i]);
  fclose(fpb); //从文件中读出数据,将其赋给数组yb[];
  for(i=0;i<512;i++)
    xb[i]=i;
    Canvas->MoveTo(20,450);
    for(i=0;i<512;i++)
    {
      p_xb=xb[i]+20;
      p_yb=-yb[i]+450; //坐标转换;
      Canvas->LineTo(p_xb,p_yb);
    }
  Canvas->MoveTo(20,460);
  Canvas->LineTo(20,500);
  Canvas->LineTo(532,500); // 画出C相端口信号
  for(i=0;i<=5;i++)
  Canvas->TextOut(20+100*i,502,100*i);
  Canvas->TextOut(0,460,40); //标出横纵刻度;
  float xc[512],p_xc;
  float yc[512],p_yc;
  FILE *fpc;
  char *file_namec="e:/测试信号/C相.txt";
  fpc=fopen(file_namec,"r");
  for(i=0;i<512;i++)
  fscanf(fpc,"%f",&yc[i]);
  fclose(fpc); //从文件中读出数据,将其赋给数组yc[];
  for(i=0;i<512;i++)
    xc[i]=i;
    Canvas->MoveTo(20,500);
    for(i=0;i<512;i++)
    {
      p_xc=xc[i]+20;
      p_yc=-yc[i]+500; //坐标转换;
      Canvas->LineTo(p_xc,p_yc);
    }    //画出A、B、C三相断口信号
//------------------------------------------------------------------------------
//机械特性参数的提取
//  int j,k,LX,level,KL;
  int STAGE2=8;
  getdata1(DATALEN);
  de2composek(STAGE2);//小波变换部分
   // 提取TIM3时间点(动触头开始运动的时刻)
   int  PX1=DATALEN/pow(2,app_level);
   int  PX2=DATALEN/pow(2,det_level);
   int index1,INDEX,Y1,Y2,I2;
   float tem1,tem2;
   int TIM3;
   tem1=data[app_level][0];
   for (i=1;i<PX1;i++)
    {
      if(data[app_level][i]>tem1)
       tem1=data[app_level][i];
    }
    for (i=0;i<PX1;i++)
     {
       if(data[app_level][i]==tem1)
       break;
      }
   INDEX=i+2-stair;
   Y1=(INDEX-1)*pow(2,(app_level-det_level));
   Y2=INDEX*pow(2,(app_level-det_level));
    tem2=fabs(dataex[det_level][Y1+PX2]);
   for(i=Y1+PX2+1;i<=Y2-2+PX2;i++)
   {
     if(fabs(dataex[det_level][i])>tem2)
     tem2=fabs(dataex[det_level][i]);
     }
     for(i=Y1+PX2;i<=Y2-2+PX2;i++)
     {
       if(fabs(dataex[det_level][i])==tem2)
         break;
       }
     I2=i-PX2;   //注意:次数对应Matlab中的I2(end)+Y1-1;
    TIM3=I2*pow(2,det_level);
    // 找出电流启动点
   int Initiate=4,Timex;//假设启动电流为4mA
   Timex=tipan(0,TIM3,Initiate);
   int Ta,Tb,Tc,max,min; //找出C相(例)速度参数
   //找出前/后最大值,并计算出最低电压,假设稳态电压U=1.0V
   int qianmax,houmax;
   float Umin,U=1.0;
   qianmax=Maxzhi(0,0,TIM3);
   houmax=Maxzhi(0,TIM3,512);
   Umin=data[0][qianmax]*U/data[0][houmax];
   float suduc=0.0,sudute=0.0,sudupj=0.0;
    for(i=0;i<512;)
    {
       if(ya[i]!=0)
        break;
       else
         i++;
       }
       Ta=i;
    for(i=0;i<512;)
    {
       if(yb[i]!=0)
        break;
       else
         i++;
       }
       Tb=i;
      for(i=0;i<512;)
    {
       if(yc[i]!=0)
        break;
       else
         i++;
       }
       Tc=i;
       max=Ta;
      if(Tb>Ta)
           max=Tb;
      if(Tc>max)
            max=Tc;
        min=Ta;
      if(Tb<Ta)
           min=Tb;
      if(Tc<min)
            min=Tc;
     for(i=0;i<11;i++) //计算刚合速度
      suduc+=y[Tc-5+i];
      suduc=suduc/11;
    int TStart=120,TEnd=135; //计算指定时间段平均速度
    for(i=TStart;i<=TEnd;i++)
    sudute+=y[i];
    sudute=sudute/(TEnd-TStart);
    for(i=TIM3;i<=Tc;i++) //计算合闸平均速度
    sudupj+=y[i];
    sudupj=sudupj/(Tc-TIM3+1);

   Canvas->MoveTo(Timex+20,340);//标出Timex线
   Canvas->LineTo(Timex+20,10);
   Canvas->MoveTo(qianmax+20,340);//标出qianmax线
   Canvas->LineTo(qianmax+20,10);
   Canvas->MoveTo(houmax+20,340);//标出houmax线
   Canvas->LineTo(houmax+20,10);
   Canvas->Pen->Color=clRed;  //在图中标出TIM3线
   Canvas->MoveTo(TIM3+20,340);
   Canvas->LineTo(TIM3+20,10);
   Canvas->Pen->Color=clBlue;  //在图中标出Tc线
   Canvas->MoveTo(Tc+20,500);
   Canvas->LineTo(Tc+20,10);
    Canvas->Pen->Color=clPurple;
   Canvas->MoveTo(127,340);
   Canvas->LineTo(127,10);


    Edit1->Text=IntToStr(max-Timex)+"mS";
    Edit2->Text=IntToStr(max-min)+"mS";
    Edit3->Text=FloatToStr(suduc)+"m/s";
    Edit4->Text=FloatToStr(sudute)+"m/s";
    Edit5->Text=IntToStr(TIM3)+"mS";
    Edit6->Text=FloatToStr(sudupj)+"m/s";
    Edit7->Text=FloatToStr(y[511])+"mm";
    Edit8->Text=FloatToStr(y[511]-y[Tc])+"mm";
    Edit9->Text=FloatToStr(Umin)+"V";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Close();
}
//---------------------------------------------------------------------------
 void gethdata()//得到H滤波器系数数据
  {
    int i,k=2;
    filterlen=k;
    float filter[2]={1/sqrt(2),1/sqrt(2)};
    for(i=0;i<30;i++)
     h1[i]=0;
    for(i=0;i<filterlen;i++)
     h1[i]=filter[i];
     }
     void getdata1(int DATA)//读取数据
     {
      int i;
      float temp;
      FILE *fp;
      for(i=0;i<DATALEN;i++)
      data[0][i]=0;

⌨️ 快捷键说明

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