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

📄 demon.c

📁 利用demon数据进行特征提取的C语言程序
💻 C
字号:

//
#include "_stdio.h"
#include "iface.h"
#include "allnodes.h"
#include "math.h"
#include "mathl.h"
#include "vectorl.h"
#include "stdlib.h"
#include "targetstruct.h"
#include "statl.h"
#define pi 3.1415926
#define demondatalength 512
#define MAXDEMON 20
#define POLYPLOIDDEMON 1
asm("#include <def21060.h>");

int demonstatistictime=8;//最大统计时间
float ratiodemon;
float thresholddemon=0.3;//线谱门限,当该点和左右两点的均值的差大于thresholddemon时,认为该点是符合条件的线谱
float  demontimethre=5,tempdemon1,tempdemon11,tempdemon2;//demontimethre是稳定线谱的稳定时间门限,最大为8秒。
segment("seg_extern21") float  demon_s[18][demondatalength];//原始信号输入的保存位置
segment("seg_extern22") volatile float  single_countdemon1[18][demondatalength];
segment("seg_extern23") float  single_specdemon1[18][demondatalength];
segment("seg_extern24") float  tempdatademon1[18][demondatalength*8];
segment("seg_extern25") float  innercount_demon[18];
segment("seg_extern26") int    woddle_Freqdemon[demondatalength];
segment("seg_extern27") volatile float  single_countdemon2[18][demondatalength];
segment("seg_extern28") float  tempdatademon2[18][demondatalength*8];
segment("seg_extern31") float  output_demon1[18][demondatalength];////////////////内存改变※※
segment("seg_extern32") float  output_demon2[18][demondatalength];////////////////内存改变※※
segment("seg_extern33") float  demon_mean[18];////////////////内存改变※※均值
segment("seg_extern34") float  demon_std[18];////////////////内存改变※※方差
segment("seg_extern35") float  lasttempdemon[demondatalength];////////////////内存改变※※
extern demonSENDBACK demonsendback[18];
extern PUnitDemon punitdemon[18];/*DEMON信息*/

void demon(int num1)
{
	int i,j,f;
	int count=0;
	int second_count;
	int mydemoncount;
	int woddle_maxF;
    int woddle_f;

    innercount_demon[num1]++;//各个单元目标的时间计数器
    second_count=innercount_demon[num1];
	/*接收输入的demon信号,并进行累计处理,加权为同权值*/

	if(innercount_demon[num1]<MAXDEMON)
	{
	  for(i=0;i<demondatalength;i++)
	  {
	     single_specdemon1[num1][i]=(1-(1/innercount_demon[num1]))*single_specdemon1[num1][i]+1/innercount_demon[num1]*punitdemon[num1].demon_out[i];
		  demon_s[num1][i]=single_specdemon1[num1][i];
	  }
	}
	else
	{
	  for(i=0;i<demondatalength;i++)
	  {
	     single_specdemon1[num1][i]=0.95*single_specdemon1[num1][i]+0.5*punitdemon[num1].demon_out[i];
	     demon_s[num1][i]=single_specdemon1[num1][i];
	  }
	}
	


	 
	/*输入数据进行能量归一化*/
	tempdemon1=vsummag2_f_D(demon_s[num1],demondatalength);
	tempdemon1=pow(tempdemon1,0.5);
	for(i=0;i<demondatalength;i++) demon_s[num1][i]=demon_s[num1][i]/tempdemon1;
  
   for(i=0;i<demondatalength;i++) woddle_Freqdemon[i]=8;
   woddle_maxF=vmax_i_D(woddle_Freqdemon,demondatalength);//最大的多普勒频移数

   //利用均值方差法获得满足阈值条件的线谱,进行滑动加窗处理
   tempdemon1=0;
	for(j=0;j<demondatalength;j++) tempdemon1=tempdemon1+demon_s[num1][j];
   demon_mean[num1]=tempdemon1/demondatalength;
   for(j=0;j<demondatalength;j++) lasttempdemon[j]=demon_s[num1][j]-demon_mean[num1];
	for(j=0;j<demondatalength;j++) lasttempdemon[j]=lasttempdemon[j]*lasttempdemon[j];
   tempdemon11=vsum_f_D(lasttempdemon,demondatalength);
   tempdemon1=tempdemon11/demondatalength;
	demon_std[num1]=sqrt(tempdemon1);
	demon_mean[num1]=demon_mean[num1]+POLYPLOIDDEMON*demon_std[num1];
	for(i=0;i<demondatalength;i++)
	{
	
	   if(demon_s[num1][i]>=demon_mean[num1])
	   {
         single_countdemon1[num1][i]=demonstatistictime;
         single_countdemon2[num1][i]=demon_s[num1][i];
	   }
	   else
	   {
	     single_countdemon1[num1][i]=0;
         single_countdemon2[num1][i]=0;   
	   }
	}
	/*将1~8秒的处理后数据转移到8秒的大空间中*/
    if(second_count<=demonstatistictime)
    {
	   for(f=0;f<demondatalength;f++)
	   {
  	      tempdatademon1[num1][f+demondatalength*(second_count-1)]=single_countdemon1[num1][f];
          tempdatademon2[num1][f+demondatalength*(second_count-1)]=single_countdemon2[num1][f];
	   }
    }
  	 else
	 {
       /*数据入栈,始终保留最新的8秒数据*/
	   for(i=0;i<(demonstatistictime-1)*demondatalength;i++)
	   {
		   tempdatademon1[num1][i]=tempdatademon1[num1][i+demondatalength];
	   	   tempdatademon2[num1][i]=tempdatademon2[num1][i+demondatalength];
       }
	   for(f=0;f<demondatalength;f++)
	   {
		   tempdatademon1[num1][f+(demonstatistictime-1)*demondatalength]=single_countdemon1[num1][f]; 
		   tempdatademon2[num1][f+(demonstatistictime-1)*demondatalength]=single_countdemon2[num1][f]; 
       }
	   mydemoncount=0;
	  /*得到符合demontimethre秒稳定的线谱,即特到目标的特征线谱并将最后结果写入外存中*/
	 	vset_f_D(output_demon1[num1],0,demondatalength);
      vset_f_D(output_demon2[num1],0,demondatalength);
      for(i=0;i<demonstatistictime;i++)
	   {
		  mydemoncount=mydemoncount+1;
	     for(f=woddle_maxF;f<demondatalength-woddle_maxF-1;f++)
		  {
	        woddle_f=woddle_Freqdemon[f];
		     tempdemon1=0;
           tempdemon2=0;
		     for(j=0;j<(2*woddle_f+1);j++)
		     {
			     tempdemon1=tempdemon1+tempdatademon1[num1][f-woddle_f+j+i*demondatalength];
              tempdemon2=tempdemon2+tempdatademon2[num1][f-woddle_f+j+i*demondatalength];
			  }
   		  if(tempdemon1>=demonstatistictime) 
			  {
			 	 output_demon1[num1][f]=output_demon1[num1][f]+demonstatistictime*mydemoncount;
             output_demon2[num1][f]=tempdemon2+output_demon2[num1][f];
			  }

  			  else
			  {
			    output_demon1[num1][f]=output_demon1[num1][f];
             output_demon2[num1][f]=output_demon2[num1][f];
			  }
  		  }
	     for(f=0;f<woddle_maxF;f++)
		  {
		     output_demon1[num1][f]=0;
           output_demon2[num1][f]=0;

		  }
		  for(f=demondatalength-woddle_maxF-1;f<demondatalength;f++)
		  {
 		     output_demon1[num1][f]=0;
           output_demon2[num1][f]=0;

		  }
      }
	   demonsendback[num1].targetid=  num1%3+1;
      demonsendback[num1].buoyid=(int)(num1/3)+1;
	   for(f=0;f<demondatalength;f++)
	   {
	     tempdemon1=output_demon1[num1][f]/demonstatistictime;
	  	  if(tempdemon1>=demontimethre)
		    demonsendback[num1].output[f]=output_demon2[num1][f]/tempdemon1;
		  else
			 demonsendback[num1].output[f]=0;
	   }


	   tempdemon1=0;


	   for(i=0;i<demondatalength;i++) tempdemon1=tempdemon1+demonsendback[num1].output[i];
	   if(tempdemon1>0) 
	   {
	     for(i=0;i<demondatalength;i++) demonsendback[num1].output[i]=demonsendback[num1].output[i];
	   }
	   else
	   {
	     for(i=0;i<demondatalength;i++) demonsendback[num1].output[i]=0;
	   }
 
    }
}

⌨️ 快捷键说明

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