將android收集到的數據寫入CSV之後,就方便我們進行數據統計與計算了。對於原始數據,主要有以下幾種濾波方法:
1,均值濾波
採集數據時間間隔假設爲0.5秒,連續採集一段時間,取改短時間內的RSSI均值。但是該方法雖然可以在一定程度上減小干擾導致的差距,但是在出現較大的波動時,該種方式依然將較大波動計算在內,會影響採集的指紋的精確度。
import matplotlib.pyplot as plt
import pandas as pd
def showData():
dataT = list(pd.read_csv('./dataRM.csv', dtype='float64').mean())[:10]
print(dataT)
plt.plot(dataT, 'o')
plt.show()
if __name__ == '__main__':
showData()
採樣測試數據並不是很好
2,低通濾波
一階低通濾波法採用本次採樣值與上次濾波輸出值進行加權,得到有效濾波值,使得輸出對輸入有反饋作用。
Y(n)=αX(n) + (1-α)Y(n-1)
式中:α=濾波係數;X(n)=本次採樣值;Y(n-1)=上次濾波輸出值;Y(n)=本次濾波輸出值。
realA = 0
for t=2 in length(A)
if t<10:
realA(t) = realA(t-1)*0.5 + 0.5* A(t)
else:
realA(t) = realA(t-1)*0.995 + 0.005*A(t)
return
下圖爲實驗測試結果:
可以觀察到,使用低通濾波,最快可在10次迭代出現穩定的變化。
3,高斯濾波:
我們將採集的數據畫一個頻率直方圖,橫座標爲信號強度,縱座標爲出現頻率。
可以觀察到,某個點的信號強度總體呈現正態分佈的特點。即RSSI~N(,)服從正態分佈。即:
P(- < X <= +) = 0.683
P(-2 < X <= +2) = 0.954
其中
= 採樣值的均值 = , = 標準差 =
我們可以使用這個進行計算,來推演出該處的RSSI出現最多值的均值作爲此處的RSSI值。
4,點雲濾波PCL
對於magnetic數據,我們常常會使用地磁採集數據的X,Y,Z分量進行計算。對於在三維空間中的點,我們可以使用PCL點雲進行計算,求出出現高綠最高的某區域點進行計算。
5,卡爾曼濾波
卡爾曼濾波主要是以下的5個函數,包含狀態更新函數和時間更新函數。詳細介紹請查詢資料。
主要代碼:
class Kalman{
public:
Kalman(double Q, double R);
double KalmanFilter(double value);
private:
double startValue; //k-1時刻的濾波值,即是k-1時刻的值
double kalmanGain; // Kalamn增益
double A; // x(n)=A*x(n-1)+u(n),u(n)~N(0,Q)
double H; // z(n)=H*x(n)+w(n),w(n)~N(0,R)
double Q; //預測過程噪聲偏差的方差
double R; //測量噪聲偏差,(系統搭建好以後,通過測量統計實驗獲得)
double P; //估計誤差協方差;
};
double Kalman::KalmanFilter( double value)
{
//預測下一時刻的值
double predictValue = A* startValue;
//求預測下一時刻的協方差
P = A*A*P + Q;
//計算先驗均方差
p(n|n-1)=A^2*p(n-1|n-1)+q
//計算kalman增益
kalmanGain = P*H / (P*H*H + R);
//修正結果,即計算濾波值
startValue = predictValue + (value - predictValue)*kalmanGain;
//利用殘餘的信息改善對x(t)的估計,給出後驗估計,這個值也就是輸出
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1))
//更新後驗估計
P = (1 - kalmanGain*H)*P;
//計算後驗均方差
P[n|n]=(1-K[n]*H)*P[n|n-1]
return startValue;
}