前言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
浏览量:1848
时间:
来源:图南yukino
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

最新资讯
-
抖音再现本地生活服务,咫尺同城圈商业变现新通道
短视频成为本地生活探店网红营销变现引流的新阵地,每一位网红都渴望在短视频内“一夜爆红”。即速应用团队对多商家小程序进行升级,打造了咫尺同城圈:“同城探店营销助手”,不仅完善商家营销技巧,还助力探店网红玩转本地生活服务。 -
抖音再现本地生活服务,咫尺同城圈商业变现新通道
短视频成为本地生活探店网红营销变现引流的新阵地,每一位网红都渴望在短视频内“一夜爆红”。即速应用团队对多商家小程序进行升级,打造了咫尺同城圈:“同城探店营销助手”,不仅完善商家营销技巧,还助力探店网红玩转本地生活服务。 -
阿坝小程序代理
阿坝藏族羌族小程序代理公司有哪些?阿坝藏族羌族小程序代理平台哪个好?阿坝藏族羌族小程序代理商怎么收费,代理政策如何?下面就让即速应用产品经理jisuapp.cn来告诉你吧!