📄 ashi.cpp
字号:
#include "stdio.h"
#include "memory.h"
#include "iostream.h"
#include "math.h"
//返回采样数据中每个脉宽内含的采样数据个数
void impluse_width(unsigned long RadData[1024],unsigned int N[1024]);
void impluse_width1(unsigned long RadData[1024],unsigned int N[1024]);
/*
//返回采样数据中脉宽内含的采样数据平均个数
unsigned int impluse_width(unsigned long RadData[1024]);
*/
void main()
{
int i;
// 采样得到的数据 幅度是10或者5
unsigned long SampleData1[1024]={168430090,168428810,84542730,0,
168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,
168430090,168430090,168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,168430090,168430090,
168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,
168430090,168430090,168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,168430090,168430090,
168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,0,0};
unsigned long SampleData2[1024]={0,168430090,168428810,84542730,0,
168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,
168430090,168430090,168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,168430090,168430090,
168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,
168430090,168430090,168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,168430090,168430090,
168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,0,0};
//在下面一种条件下,刚开始会多产生两个数
unsigned int SampleNum[1024];//数据大小根据实际调整,高16位村脉冲采样个数,低16位存脉宽采样个数
// Test
memset(SampleNum,0,1024*sizeof(unsigned int));//给SampleNum[1024]赋初值
impluse_width(SampleData1,SampleNum);
for(i=0;SampleNum[i]!=0;i++)
cout<<" "<<((SampleNum[i]&0xFFFF0000)>>16)<<" "<<(SampleNum[i]&0x0000FFFF);
cout<<endl<<"Parameter1 Measure method1 Over";
cout<<endl;
printf("\n");
printf("\n");
memset(SampleNum,0,1024*sizeof(unsigned int));//给SampleNum[1024]赋初值
impluse_width(SampleData2,SampleNum);
for(i=0;SampleNum[i]!=0;i++)
cout<<" "<<((SampleNum[i]&0xFFFF0000)>>16)<<" "<<(SampleNum[i]&0x0000FFFF);
cout<<endl<<"Parameter2 Measure method1 Over";
cout<<endl;
printf("\n");
printf("\n");
memset(SampleNum,0,1024*sizeof(unsigned int));//给SampleNum[1024]赋初值
impluse_width1(SampleData1,SampleNum);
for(i=0;SampleNum[i]!=0;i++)
cout<<" "<<((SampleNum[i]&0xFFFF0000)>>16)<<" "<<(SampleNum[i]&0x0000FFFF);
cout<<endl<<"Parameter1 Measure method2 Over";
cout<<endl;
printf("\n");
printf("\n");
memset(SampleNum,0,1024*sizeof(unsigned int));//给SampleNum[1024]赋初值
impluse_width1(SampleData2,SampleNum);
for(i=0;SampleNum[i]!=0;i++)
cout<<" "<<((SampleNum[i]&0xFFFF0000)>>16)<<" "<<(SampleNum[i]&0x0000FFFF);
cout<<endl<<"Parameter2 Measure method2 Over";
cout<<endl;
printf("\n Over!");
}
void impluse_width(unsigned long RadData[1024],unsigned int N[1024])
{
int i=0,j=0,k=0;
int PW_Sample=0,PRI_Sample=0; //脉宽内采样点个数 周期内采样点个数
unsigned int RadDataTemp1=0,RadDataTemp2=0;
bool RSampleFlag=false; //高电平标志
bool DSampleFlag=false; //低电平标志
while (i<1024)
{
//RadDataTemp2为前面一个数
//RadData采样数据格式,现认为是先存高位后存低位,用右移;否则左移
/************************************************************************/
/* 这段代码有问题 */
/* 如果是第一个数是高电平的话,则不管怎样就会认为有上边沿 */
/* 开始,RadDataTemp1=0,RadDataTemp2=0; */
/* 执行完 RadDataTemp2=RadDataTemp1; */
/* RadDataTemp1=(RadData[i]&(0xFF000000>>(8*j)))>>(24-8*j); */
/* 这时:RadDataTemp2=0;RadDataTemp1为高电平,那么开始计算脉宽; */
/* 实际上,采样数据不一定刚好是上边沿的第一个,有可能高电平的中间; */
/* 这样第一个数据数据就有不对的 */
/************************************************************************/
RadDataTemp2=RadDataTemp1;
RadDataTemp1=(RadData[i]&(0xFF000000>>(8*j)))>>(24-8*j);
j++;
/************************************************************************/
/* 我具体不知你的想法,大体这么理解的: */
/* 后一数据大前一数据6,就认为有上边沿 */
/* 后一数据小前一数据6,就认为有下边沿 */
/* 当有边沿时,记下数值 */
/************************************************************************/
if ((RadDataTemp1<RadDataTemp2)&&(RadDataTemp2-RadDataTemp1>6)&&PW_Sample)
//两个数大小不超过6就认为没有经过上升沿或者下降沿
{
N[k]=PW_Sample;
PW_Sample=0;
}
else if((RadDataTemp2<RadDataTemp1)&&(RadDataTemp1-RadDataTemp2>6)&&PRI_Sample)
{
N[k]=PRI_Sample<<16|N[k];
PRI_Sample=0;
k++;
}
/************************************************************************/
/* 只要为高电平或低电平,就计数 */
/* 应该是有边沿后计数 */
/************************************************************************/
if ( RadDataTemp1>4)//大小大于4 就认为是高电平
{
RSampleFlag=true;
DSampleFlag=false;
}
else
{
DSampleFlag=true;
RSampleFlag=false;
}
if (RSampleFlag&&(!DSampleFlag))
//是高电平
{
PW_Sample++;
PRI_Sample++;
}
else if(DSampleFlag&&(!RSampleFlag)) //是低电平
{
PRI_Sample++;
}
if (j>3)
//完成对4个采样数据的处理
{
j=0;
i++;
}
}
}
//修改后的
/************************************************************************/
/* 思路如下: */
/* 采样数据近来后,判到有跳沿后才开始脉宽计数、周期计数; */
/* 当得到两次跳沿后,认为一个周期完成,存脉宽计数、周期计数; */
/* 一个周期完成,即另一个周期的开始,应在存完后,清脉宽计数、周期计数;
开始另一个周期的计数 */
/* 存在的问题:采样数据若有一段时间采空,即为0,那么可能这段时间也有可能被
当作周期计数 */
/************************************************************************/
void impluse_width1(unsigned long RadData[1024],unsigned int N[1024])
{
int i=0,j=0,k=0;
int PW_Sample=0,PRI_Sample=0; //脉宽内采样点个数 周期内采样点个数
unsigned int RadDataTemp1=0,RadDataTemp2=0;
int EdgeFlag=0;//边沿标志
int tolerance=6;//低平抖动容差
unsigned int threshold=4;//高、低电平判决门限
//RadDataTemp2为前面一个数
RadDataTemp2=(RadData[i]&(0xFF000000>>(8*j)))>>(24-8*j);
j++;
while (i<1024)
{
RadDataTemp1=(RadData[i]&(0xFF000000>>(8*j)))>>(24-8*j);
j++;
/* 前后差大于tolerance,有跳沿 */
if (abs(RadDataTemp1-RadDataTemp2)>=tolerance)
{
if (EdgeFlag==0)
{
if((RadDataTemp1>=threshold)&&(RadDataTemp2<threshold))
EdgeFlag++;
}
else
EdgeFlag++; /* 跳沿加1*/
if (EdgeFlag==3)/* 经过2次跳沿,一周期完成*/
{
N[k]=(PRI_Sample<<16)|PW_Sample;
k++;
PRI_Sample=0;
PW_Sample=0;
EdgeFlag=1;/* 一周期完成,即另一周期的开始*/
}
}
if (EdgeFlag!=0) /*一周期开始才计数*/
{
PRI_Sample++;
if ( RadDataTemp1>=threshold)//大于等于threshold,就认为是高电平
PW_Sample++;
}
//完成对4个采样数据的处理
if (j>3)
{
j=0;
i++;
}
RadDataTemp2=RadDataTemp1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -