2673|3

190

帖子

10

TA的资源

一粒金砂(中级)

楼主
 

【KW41Z】步行仪算法 [复制链接]

步行仪 一个关键算法是窗函数算法,进ACC进行动态阀值 。
  1. void TimeWindow()
  2. {
  3.         if(ReReg==2)                //如果是新开始的第一步,直接在记步缓存中加1
  4.         {
  5.                 TempSteps++;
  6.                 Interval=0;  //时间窗
  7.                 ReReg=1;
  8.                 InvalidSteps=0;
  9.         }
  10.         else                                //如果不是新开始的第一步
  11.         {
  12.                 if((Interval>=TIMEWINDOW_MIN)&&(Interval<=TIMEWINDOW_MAX))        //如果时间间隔在有效的时间窗内
  13.                 {
  14.                         InvalidSteps=0;
  15.                         if(ReReg==1)                                        //如果还没有找到规律
  16.                         {
  17.                                 TempSteps++;                                //记步缓存加1
  18.                                 if(TempSteps>=REGULATION)        //如果记步缓存达到所要求的规律数
  19.                                 {
  20.                                         ReReg=0;                                //已经找到规律
  21.                                         STEPS=STEPS+TempSteps;        //更新显示
  22.                                         TempSteps=0;
  23.                                 }
  24.                                 Interval=0;
  25.                         }
  26.                         else if(ReReg==0)                                //如果已经找到规律,直接更新显示
  27.                         {
  28.                                 STEPS++;
  29.                                 TempSteps=0;
  30.                                 Interval=0;
  31.                         }
  32.                 }
  33.                 else if(Interval<TIMEWINDOW_MIN)        //如果时间间隔小于时间窗下限
  34.                 {
  35.                         if(ReReg==0)                                        //如果已经找到规律
  36.                         {
  37.                                 if(InvalidSteps<255)         InvalidSteps++;        //无效步缓存加1
  38.                                 if(InvalidSteps>=INVALID)                                //如果无效步达到所要求的数值,则重新寻找规律
  39.                                 {
  40.                                         InvalidSteps=0;
  41.                                         ReReg=1;
  42.                                         TempSteps=1;
  43.                                         Interval=0;
  44.                                 }
  45.                                 else                                                                        //否则,只丢弃这一次的记步,但是继续记步,不需要重新寻找规律
  46.                                 {
  47.                                         Interval=0;
  48.                                 }
  49.                         }
  50.                         else if(ReReg==1)                                //如果还没有找到规律,则之前的寻找规律过程无效,重新寻找规律
  51.                         {
  52.                                 InvalidSteps=0;
  53.                                 ReReg=1;
  54.                                 TempSteps=1;
  55.                                 Interval=0;
  56.                         }
  57.                 }
  58.                 else if(Interval>TIMEWINDOW_MAX)        //如果时间间隔大于时间窗上限,记步已经间断,重新寻找规律
  59.                 {
  60.                         InvalidSteps=0;
  61.                         ReReg=1;
  62.                         TempSteps=1;
  63.                         Interval=0;
  64.                 }
  65.         }
  66. }
复制代码



二、计步算法
  1. void step_counter()
  2. {        //采样周期50Hz
  3.         unsigned char jtemp = 0;

  4. //                PORTD=0xFF;

  5.         //----------------------------------------------ADC采样----------------------//
  6.         for(jtemp=X_CHANNEL; jtemp<=Z_CHANNEL; jtemp++)
  7.         {
  8.                 #if 0
  9.                 adc_read(jtemp); //加速度的采样值

  10.                 //Step_Result[jtemp*2+5]=Adresult>>8;
  11.                 //Step_Result[jtemp*2+6]=Adresult & 0xFF;
  12.                
  13.                 _array3[jtemp]=_array2[jtemp];//滑动平均
  14.                 _array2[jtemp]=_array1[jtemp];
  15.                 _array1[jtemp]=_array0[jtemp];

  16.                 _array0[jtemp]=StepAcc[jtemp];
  17.                 _adresult[jtemp]=_array0[jtemp]+_array1[jtemp]+_array2[jtemp]+_array3[jtemp];
  18.                 _adresult[jtemp]=_adresult[jtemp]>>2;//求平均值
  19.                 #endif
  20.                
  21.                 _adresult[jtemp]=StepAcc[jtemp];
  22.                
  23.                 if (_adresult[jtemp]>_max[jtemp])
  24.                 {
  25.                         _max[jtemp]=_adresult[jtemp]; //
  26.                 }
  27.                 if (_adresult[jtemp]<_min[jtemp])
  28.                 {
  29.                         _min[jtemp]=_adresult[jtemp];
  30.                 }
  31.         }

  32.         sampling_counter=sampling_counter+1;

  33.         //----------------------------------计算动态门限和动态精度-----------------------//
  34.         if (sampling_counter==50*2)  //60
  35.         {
  36.                 sampling_counter=0;

  37.                 for(jtemp=X_CHANNEL; jtemp<=Z_CHANNEL; jtemp++)
  38.                 {
  39.                         _vpp[jtemp]=_max[jtemp]-_min[jtemp];//动态阈值
  40.                         _dc[jtemp]=_min[jtemp]+(_vpp[jtemp]>>1); //中心值
  41.                         _max[jtemp]=0;
  42.                         _min[jtemp]=1023;
  43.                         _bad_flag[jtemp]=0;
  44.                         if (_vpp[jtemp]>=160)  //动态精度
  45.                         {
  46.                                 _precision[jtemp]=_vpp[jtemp]/32; //8
  47.                         }
  48.                         else if ((_vpp[jtemp]>=50)&& (_vpp[jtemp]<160))
  49.                         {
  50.                                 _precision[jtemp]=5;
  51.                         }
  52.                         else if ((_vpp[jtemp]>=15) && (_vpp[jtemp]<50))
  53.                         {
  54.                                 _precision[jtemp]=3;
  55.                         }

  56.                         else
  57.                         {
  58.                                 _precision[jtemp]=2;
  59.                                 _bad_flag[jtemp]=1;
  60.                         }

  61.                 }
  62.         }

  63.         //--------------------------线性移位寄存器--------------------------------------

  64.         for(jtemp=X_CHANNEL; jtemp<=Z_CHANNEL; jtemp++)
  65.         {  //移位寄存器组可以消除高频噪声,从而保证结果更加精确
  66.                 _old_fixed[jtemp]=_new_fixed[jtemp];
  67.                
  68.                 //如果加速度变化大于预定义精度,则最新的采样结果sample_result移入sample_new寄存器,否则sample_new寄存器保持不变
  69.                 if (_adresult[jtemp]>=_new_fixed[jtemp])
  70.                 {
  71.                         if((_adresult[jtemp]-_new_fixed[jtemp])>=_precision[jtemp])
  72.                         {
  73.                                 _new_fixed[jtemp]=_adresult[jtemp];
  74.                         }
  75.                 }
  76.                 if (_adresult[jtemp]<_new_fixed[jtemp])
  77.                 {
  78.                         if((_new_fixed[jtemp]-_adresult[jtemp])>=_precision[jtemp])
  79.                         {
  80.                                 _new_fixed[jtemp]=_adresult[jtemp];
  81.                         }
  82.                 }
  83.         }

  84.         //------------------------- 动态门限判决 ----------------------------------
  85.         if(Interval < 0xFF)        //时间间隔数加1,但不能产生溢出  //调用周期为100Hz
  86.         {
  87.                 Interval++;
  88.         }
  89.         //步伐迈出的条件定义为:当加速度曲线跨过动态阈值下方时,加速度曲线的斜率为负值(sample_new <sample_old)
  90.         if ((_vpp[X_CHANNEL]>=_vpp[Y_CHANNEL])&&(_vpp[X_CHANNEL]>=_vpp[Z_CHANNEL]))
  91.         {//X轴上敏感
  92.                 if ((_old_fixed[X_CHANNEL]>=_dc[X_CHANNEL])&&(_new_fixed[X_CHANNEL]<_dc[X_CHANNEL])&&(_bad_flag[X_CHANNEL]==0))
  93.                 {
  94.                         TimeWindow();
  95.                         //STEPS=STEPS+1;
  96.                 }
  97.         }
  98.         else if ((_vpp[Y_CHANNEL]>=_vpp[X_CHANNEL])&&(_vpp[Y_CHANNEL]>=_vpp[Z_CHANNEL]))
  99.         {//Y轴上敏感
  100.                 if ((_old_fixed[Y_CHANNEL]>=_dc[Y_CHANNEL])&&(_new_fixed[Y_CHANNEL]<_dc[Y_CHANNEL])&&(_bad_flag[Y_CHANNEL]==0))
  101.                 {
  102.                         TimeWindow();
  103.                         //STEPS=STEPS+1;
  104.                 }
  105.         }
  106.         else if ((_vpp[Z_CHANNEL]>=_vpp[Y_CHANNEL])&&(_vpp[Z_CHANNEL]>=_vpp[X_CHANNEL]))
  107.         {//Z轴上敏感
  108.                 if ((_old_fixed[Z_CHANNEL]>=_dc[Z_CHANNEL])&&(_new_fixed[Z_CHANNEL]<_dc[Z_CHANNEL])&&(_bad_flag[Z_CHANNEL]==0))
  109.                 {
  110.                         TimeWindow();
  111.                         //STEPS=STEPS+1;
  112.                 }
  113.         }

  114.         //---------------------------------- 保存结果-----------------------------------------
  115.         //Save_Result();
  116. }
复制代码

此帖出自NXP MCU论坛

最新回复

我记得ADI公开的一个应用笔记????  详情 回复 发表于 2017-7-11 10:20
点赞 关注(1)
 

回复
举报

58

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我也在pudn看到了这个~
此帖出自NXP MCU论坛

点评

嗯,源于ADI的  详情 回复 发表于 2017-7-10 19:19
 
 
 

回复

190

帖子

10

TA的资源

一粒金砂(中级)

板凳
 
荣丰宇 发表于 2017-7-10 13:21
我也在pudn看到了这个~

嗯,源于ADI的
此帖出自NXP MCU论坛
 
 
 

回复

653

帖子

1

TA的资源

纯净的硅(中级)

4
 
我记得ADI公开的一个应用笔记????
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表