📄 demon.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 + -