前言
最近在做利用小程序接收 ibeacon 的 rssi 信号进行室内定位,由于 rssi 信号波动比较大,所以在优化误差的算法部分下了很大的功夫。在网上找了很多各种各样的优化和滤波算法,有些 java 的,有c 的 ,还有 matlab 的代码,然而小程序用的是 js 代码。这里为了方便自己和之后的小伙伴,将自己最近写的代码开源出来,给大家参考。因为代码写的比较少,有改动的建议尽管给我留言。本文参考了很多博文,有些博文真的写的真的很棒,对我启发很大。
代码已经放在 github 上面,地址为 https://github.com/yukinorong/rssi_smoothing
算法简介
算法主要是参考了这篇博文 无线传感器网络中RSSI滤波的若干处理方法
测试数据和部分通用函数
testRssi1 = [32,40,45,40,42,41,39,37,50,34] // 平均值40 方差24
testRssi2 = [30,54,34,36,40,56,32,42,36,40] // 平均值40 方差68.8
// 求平均值函数
var average = function(arr){
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
};
return sum/arr.length
}
// 求方差函数
var variance = function(numbers) {
var mean = 0;
var sum = 0;
for(var i=0;i<numbers.length;i++){
sum += numbers[i];
}
mean = sum / numbers.length;
sum = 0;
for(var i=0;i<numbers.length;i++){
sum += Math.pow(numbers[i] - mean , 2);
}
return sum / numbers.length;
};
//队列 类实现 --> 递推滤波数据结构
function Queue(){
this.dataStore = [];
this.enqueue = enqueue;
this.dequeue = dequeue;
this.front = front;
this.back = back;
this.toString = toString;
this.isEmpty = isEmpty;
this.count = count;
}
function enqueue