indoorLocation(4)--數據處理的幾種方式

將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(\mu\delta ^{2})服從正態分佈。即:
P(\mu-\delta < X <= \mu+\delta) = 0.683
P(\mu-2\delta < X <= \mu+2\delta) = 0.954
其中
\mu = 採樣值的均值 = \frac{1}{n}\sum_{i=1}^{n}rssi_{i} ,    \delta = 標準差 = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(rssi_{i}-\mu)^{2} }
我們可以使用這個進行計算,來推演出該處的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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章