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

📄 unit1.cpp

📁 此代码采用C++Builder 编写,提取断路器电流信号的特征
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      char *file_name="e:/测试信号/dianliuzs.txt";
      fp=fopen(file_name,"r");
      for(i=0;i<DATA;i++)
        {
          fscanf(fp,"%f", &temp);
          data[0][i]=temp;
          }
         fclose(fp);
      }
       void getdata2(int DATA)//读取数据
     {
      int i;
      float temp;
      FILE *fp;
      for(i=0;i<DATALEN;i++)
      data[0][i]=0;
      char *file_name="e:/测试信号/xchengzs.txt";
      fp=fopen(file_name,"r");
      for(i=0;i<DATA;i++)
        {
          fscanf(fp,"%f", &temp);
          data[0][i]=temp;
          }
         fclose(fp);
      }


      float hh(int i,int m) //返回H算子周期化后的值
      {
        return h1[i+m];
        }
      float gg(int i,int m)//返回G算子周期化后的值
      {
        char  flag;
       if(i%2) flag=-1;
       else flag=1;
       return  hh(-1*i+1,m)*flag;
       }
       void hhh1(int level)//H算子周期化过程
       {
         int len,m,i,sign;
         float temp;
         len=DATALEN>>level;
         m=filterlen/2;
          for(sign=0;sign<len;sign++)
          {
           temp=0;
           for(i=(-1*m+1);i<=m;i++)
           {
             if(((sign-i)%len)==0)
             temp+=hh(i-1,m);
             }
             hhh[sign]=temp;
             }
           }
         void ggg1(int level)//G算子周期化过程
         {
           int len,m,i,sign;
           float temp;
           len=DATALEN>>level;
           m=filterlen/2;
            for(sign=0;sign<len;sign++)
             {
               temp=0;
               for(i=(-1*m+3);i<=(m+2);i++)
                {
                 if(((sign-i)%len)==0)
                 temp+=gg(i-1,m);
                 }
                 ggg[sign]=temp;
                 }
             }
           void codeh(int level,int flen,int len)//H算子作用
           {
             int i,i2,k,m,len1;
             float temp1;
             m=filterlen/2;
             len1=len>>1;
             for(i=0;i<len1;i++)
             {
              i2=2*i;
              data[level][i]=0;
              if(len>flen)
               {
                 for(k=i2-len;k<=i2-len+m;k++)
                 {
                   if((k>=0)&&(k<len))
                   if((temp1=hhh[(k-i2+len)%len])!=0)
                     data[level][i]+=temp1*data[level-1][k];
                  }
                  for(k=i2-m+1;k<=i2+m;k++)
                  {
                    if((k>=0)&&(k<len))
                    if((temp1=hhh[(k-i2+len)%len])!=0)
                     data[level][i]+=temp1*data[level-1][k];
                     }
                    for(k=i2+len-m+1;k<i2+len;k++)
                    {
                      if((k>=0)&&(k<len))
                      if((temp1=hhh[(k-i2+len)%len])!=0)
                      data[level][i]+=temp1*data[level-1][k];
                      }
                    }
                  else
                    {
                      for(k=0;k<len;k++)
                      {
                       if((temp1=hhh[(k-i2+len)%len])!=0)
                        data[level][i]+=temp1*data[level-1][k];
                        }
                      }
                    }
                  }
             void codeg(int level,int flen,int len)//G算子作用
             {
               int i,i2,k,m,len1;
               float temp1,exchange ;
               len1=len>>1;
               m=flen/2;
               for(i=0;i<len1;i++)
               {
                i2=2*i;
                data[level][i+len1]=0;
                if(len>flen)
                 {
                  for(k=i2-len;k<=i2-len+m+2;k++)
                  {
                    if((k>=0)&&(k<len))
                    if((temp1=ggg[(k-i2+len)%len])!=0)
                    data[level][i+len1]+=temp1*data[level-1][k];
                    }
                  for(k=i2-m+3;k<=i2+m+2;k++)
                  {
                    if((k>=0)&&(k<len))
                    if((temp1=ggg[(k-i2+len)%len])!=0)
                    data[level][i+len1]+=temp1*data[level-1][k];
                    }

                   for(k=i2+len-m+3;k<i2+len;k++)
                  {
                    if((k>=0)&&(k<len))
                    if((temp1=ggg[(k-i2+len)%len])!=0)
                    data[level][i+len1]+=temp1*data[level-1][k];
                    }
                    }

                  else
                   {
                     for(k=0;k<len;k++)
                    {
                    if((temp1=ggg[(k-i2+len)%len])!=0)
                    data[level][i+len1]+=temp1*data[level-1][k];
                    }
                  }
                }
                 //??此部分程序是为了对应Matlab的输出结果,将首末互换,加负号
                for(i=len1+1;i<2*len1;i++)
                dataex[level][i]=data[level][i-1];
                dataex[level][len1]=data[level][2*len1-1];
                for(i=len1;i<2*len1;i++)
                dataex[level][i]=-dataex[level][i];
             }

             void stagek2(int level,int flen)
             {
               int i,j,len,start;
               len=DATALEN>>(level-1);
               hhh1(level-1);
               ggg1(level-1);
               codeh(level,flen,len);
               codeg(level,flen,len);
               }
                void de2composek(int STAGE)//小波分解过程
                {
                  int i;
                  for(i=1;i<STAGE;i++)
                  stagek2(i,filterlen);

                  }
//以下部分为小波反变换部分

      void codehrec(int level,int flen,int len)//H*算子作用
           {
             int i,k,k1,m,len1;
             float temp1;
             len1=len>>1;
             m=flen/2;
             for(i=0;i<len;i++)
             {
              data[level-1][i]=0;
              if(len>flen)
               {
                 for(k1=(i-m);k1<(m+i);k1++)
                 {
                   k=k1/2;
                   if((k>=0)&&(k<len1)&&((k1%2)==0))
                   if((temp1=hhh[(i-2*k+len)%len])!=0)
                     data[level-1][i]+=temp1*data[level][k];
                  }
                  for(k1=(len+i-m);k1<=(len+i);k1++)
                  {
                    k=k1/2;
                   if((k>=0)&&(k<len1)&&((k1%2)==0))
                   if((temp1=hhh[(i-2*k+len)%len])!=0)
                     data[level-1][i]+=temp1*data[level][k];

                     }
                    for(k1=(i-len)+1;k1<(i-len+m);k1++)
                    {
                     k=k1/2;
                     if((k>=0)&&(k<len1)&&((k1%2)==0))
                     if((temp1=hhh[(i-2*k+len)%len])!=0)
                     data[level-1][i]+=temp1*data[level][k];
                      }
                    }
                  else
                    {
                      for(k=0;k<len1;k++)
                      {
                       if((temp1=hhh[(i-2*k+len)%len])!=0)
                        data[level-1][i]+=temp1*data[level][k];
                        }
                      }
                    }
                  }
            void codegrec(int level,int flen,int len)//G*算子作用
           {
             int i,k,k1,m,len1;
             float temp1;
             len1=len>>1;
             m=flen/2;
             for(i=0;i<len;i++)
             {
              if(len>flen)
               {
                 for(k1=(len+i-m-2);k1<(len+i);k1++)
                 {
                   k=k1/2;
                   if((k>=0)&&(k<len1)&&((k1%2)==0))
                   if((temp1=ggg[(i-2*k+len)%len])!=0)
                     data[level-1][i]+=temp1*data[level][k+len1];
                  }
                  for(k1=(i-m-2);k1<(i+m-2);k1++)
                  {
                    k=k1/2;
                   if((k>=0)&&(k<len1)&&((k1%2)==0))
                   if((temp1=ggg[(i-2*k+len)%len])!=0)
                     data[level-1][i]+=temp1*data[level][k+len1];

                     }
                    for(k1=i-len+1;k1<(i+m-len-2);k1++)
                    {
                     k=k1/2;
                     if((k>=0)&&(k<len1)&&((k1%2)==0))
                     if((temp1=ggg[(i-2*k+len)%len])!=0)
                     data[level-1][i]+=temp1*data[level][k+len1];
                      }
                    }
                  else
                    {
                      for(k=0;k<len1;k++)
                      {
                       if((temp1=ggg[(i-2*k+len)%len])!=0)
                        data[level-1][i]+=temp1*data[level][k+len1];
                        }
                      }
                    }
                  }
       void rec(int STAGE)  //小波反变换
      {
        int level,len,len1,j;
         for (level=STAGE-1;level>0;level--)
         {
           len=DATALEN>>(level-1);
           hhh1(level-1);
           ggg1(level-1);
           codehrec(level,filterlen,len);
           codegrec(level,filterlen,len);
           }
         }


      int tipan(int Start,int End, int  Yuzhi)
      {
          int i,Ty=0;
          float index;
           for(i=Start;i<End;)
           {
              if (data[0][i]>=Yuzhi)
            {
               index=i;
              break;
             }
             i++;
            }
        for(i=index+1;i<=index+10;i++)
          {
             if(data[0][i]>Yuzhi)
              continue;
              else
               {
                 Ty=i;
                  break ;
                  }
             }
        if(Ty!=0)
         tipan(Ty,End,Yuzhi);
        else
         return (index);
         }
   int Maxzhi(int level,int Start,int End)
   {
    float zhongjie;
    int i;
    zhongjie=data[level][Start];
    for (i=Start+1;i<End;i++)
    {
      if(data[level][i]>zhongjie)
       zhongjie=data[level][i];
     }
    for (i=Start;i<End;i++)
     {
       if(data[level][i]==zhongjie)
       break;
       }
     return(i) ;
     }

⌨️ 快捷键说明

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