前言1.最近在做利用小程序接收ibeacon的rssi信号进行室内定位,由于rssi信号波动比较大,所以在优化误差的算法部分下了很大的功夫。在网上找了很多各种各样的优化和滤波算法,有些java的,有c的,还有matlab的代码,然而小程序用的是js代码。这里为了方便自己和之后的小伙伴,将自己最近写的代码开源出来,给大家参考。因为代码写的比较少,有改动的建议尽管给我留言。本文参考了很多博文,有些博文真的写的真的很棒,对我启发很大。代码已经放在github上面,地址为https://github.com/yukinorong/rssi_smoothing
算法简介2.算法主要是参考了这篇博文无线传感器网络中RSSI滤波的若干处理方法
测试数据和部分通用函数testRssi1[32,40,45,40,42,41,39,37,50,34]//平均值40方差24testRssi2[30,54,34,36,40,56,32,42,36,40]//平均值40方差68.8//求平均值函数varaveragefunction(arr){varsum0;for(vari0;iarr.length;i++){sum+arr[i];};returnsum/arr.length}//求方差函数varvariancefunction(numbers){varmean0;varsum0;for(vari0;inumbers.length;i++){sum+numbers[i];}meansum/numbers.length;sum0;for(vari0;inumbers.length;i++){sum+Math.pow(numbers[i]-mean,2);}returnsum/numbers.length;};//队列类实现--递推滤波数据结构functionQueue(){this.dataStore[];this.enqueueenqueue;this.dequeuedequeue;this.frontfront;this.backback;this.toStringtoString;this.isEmptyisEmpty;this.countcount;}functionenqueue(element){this.dataStore.push(element);}functiondequeue(){returnthis.dataStore.shift();}functionfront(){returnthis.dataStore[0]}functionback(){returnthis.dataStore[this.dataStore.length-1];}functiontoString(){varretStr""for(vari0;ithis.dataStore.length;++i){retStr+this.dataStore[i]+""}returnretStr}functionisEmpty(){if(this.dataStore.length0){returntrue;}else{returnfalse;}}functioncount(){returnthis.dataStore.length;}//将数组转换为队列队列长度为5varsetQueuefunction(arr,q,length5){arr.forEach(function(value){q.enqueue(value)if(q.count()length+1){q.dequeue()}})}//排序算法中的比较函数用法array.sort(compare)varcomparefunction(x,y){//排序结果,从小到大if(x.distancey.distance){return-1;}elseif(x.distancey.distance){return1;}else{return0;}}一,均值滤波varavgSmoothingfunction(arr){varsum0;for(vari0;iarr.length;i++){sum+arr[i];};returnsum/arr.length}console.log("均值滤波:")console.log("testRssi1:",avgSmoothing(testRssi1))console.log("testRssi2:",avgSmoothing(testRssi2))二,递推平均滤波3.队列+均值滤波队列长度(基于数据量决定)
varq1newQueue()varq2newQueue()setQueue(testRssi1,q1)setQueue(testRssi2,q2)//varrecurSmoothingavgSmoothingconsole.log("递推平均滤波:")console.log("testRssi1:",avgSmoothing(q1.dataStore))console.log("testRssi2:",avgSmoothing(q2.dataStore))三,中位值滤波4.队列+求中位数
varmedianSmoothingfunction(q){vararrq.dataStorearr.sort(compare)if(q.count()%20){return(arr[q.count()/2]+arr[q.count()/2-1])/2}else{returnarr[(q.count()-1)/2]}}console.log("中位值滤波:")console.log("testRssi1:",medianSmoothing(q1))console.log("testRssi2:",medianSmoothing(q2))四,狄克逊检验法滤波5.狄克逊检验异常值+均值滤波
vardixonCheckfunction(array){vararrarrayvarlenarr.lengthvard0.530//临界值查表//根据样本长度,选择检验值ab大小if(len3len7){vara1varb1}elseif(len8len10){vara1varb2}elseif(len11len13){vara2varb2}else{vara2varb3}//检验高端异常值varrh(arr[len-1]-arr[len-1-a])/(arr[len-1]-arr[b-1])//检验低端异常值varrl(arr[a]-arr[0])/(arr[len-b]-arr[0])if(rhrlrhd){varnewarrarr.slice(0,len-1)returndixonCheck(newarr)}elseif(rlrhrld){varnewarrarr.slice(1,len)returndixonCheck(newarr)}else{returnarr}}console.log("狄克逊检验法滤波:")console.log("testRssi1:",avgSmoothing(dixonCheck(testRssi1)))console.log("testRssi2:",avgSmoothing(dixonCheck(testRssi2)))五,高斯滤波6.选择rssi值在高斯区间内部的数据。然后利用均值滤波求解。
vargaussianSmootingfunction(array){vararrarrayvaravgaverage(arr)varvvariance(arr)varnewarrnewArray()arr.forEach(function(value){if(valueavg+vvalueavg-v){newarr.push(value)}})returnavgSmoothing(newarr)}console.log("高斯滤波:")console.log("testRssi1:",gaussianSmooting(testRssi1))console.log("testRssi2:",gaussianSmooting(testRssi2))六,速度常量滤波7.a,b为增益常量;TS为采样时间间隔单位ms
varlen1testRssi1.lengthvarlen2testRssi2.lengthvarvelocitySmoothingfunction(Rpred,Rprev,a0.8,b0.1,ts200,Vpred0){varRestRpred+a*(Rprev-Rpred)varVestVpred+b/ts*(Rprev-Rpred)varnewRpredRest+Vest*tsvarnewVpredVestreturnnewRpred}console.log("速度常量滤波:")console.log("testRssi1:",velocitySmoothing(testRssi1[len1-2],testRssi1[len1-1]))console.log("testRssi2:",velocitySmoothing(testRssi2[len2-2],testRssi2[len2-1]))七,卡尔曼滤波8.一般用来拟合静态数据,即确定某个静止的定位,效果非常好,不太适合拟合动态数据。
varprevData0,p10,q0.0001,r0.005,kGain0;varkalmanSmoothingfunction(inData){pp+q;kGainp/(p+r);inDataprevData+(kGain*(inData-prevData));p(1-kGain)*p;prevDatainData;returninData;}varnewarr1newArray()testRssi1.forEach(function(value){newarr1.push(kalmanSmoothing(value))})varnewarr2newArray()testRssi2.forEach(function(value){newarr2.push(kalmanSmoothing(value))})console.log("卡尔曼滤波:显著减少数据波动")console.log("testRssi1:",newarr1,"方差为:",variance(newarr1))console.log("testRssi2:",newarr2,"方差为(在训练完testRssi1之后的状态下):",variance(newarr2))参考9.核心部分无线传感器网络中RSSI滤波的若干处理方法
10.算法部分关于显著性检验,你想要的都在这儿了!!(基础篇)HowaKalmanfilterworks,inpictures(英文原文)详解卡尔曼滤波原理(译文)协方差矩阵漫谈Clustering(3):GaussianMixtureModel高斯混合模型(GMM)及其EM算法的理解傅里叶变换(个人觉得非常好!原文在知乎)
11.代码部分javascript中的队列结构卡尔曼滤波简单理解及C语言代码卡尔曼滤波的简单实现(MatlabOC)
后记12.第一次写博文,写代码的时候就想着想要把代码开源出来,本想着想要写好写全,但是真的比想象的要困难很多,仅仅是想要把代码写好就很有难度了,更不提写一些自己对这些算法的深入思考等等,不过这样的方式真的有利于精进自己的代码水平,以后要继续以这样的方式要求自己,下次会把小程序的部分源码开源出来,这样有想法做ibeacon定位的小伙伴就不用再造轮子了。
无线传感器网络中RSSI滤波的若干处理方法小程序代码实现-小程序ibeacon三点定位-微信小程序ibeacon
浏览量:1989
时间:
来源:图南yukino
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。










