1. <tbody id="h1zu3"><div id="h1zu3"></div></tbody>

        歡迎光臨訪問安徽定遠泊松液壓機械有限公司

        新聞資訊

        傳感器3種常用算法處理,收藏!

        文字: [大] [中] [小] 2020-10-27     瀏覽次數:    

        在傳感器使用中,我們常常需要對傳感器數據進行各種整理,讓應用獲得更好的效果,以下介紹幾種常用的簡單處理方法:

         

        1.加權平滑:平滑和均衡傳感器數據,減小偶然數據突變的影響;
        2.抽取突變:去除靜態和緩慢變化的數據背景,強調瞬間變化;
        3.簡單移動平均線:保留數據流最近的K個數據,取平均值;

         

        01

        加權平

         


        使用算法如下:
        (新值) = (舊值)*(1 - a) + X * a其中a為設置的權值,X為最新數據,程序實現如下:
        float ALPHA = 0.1f;
        public void onSensorChanged(SensorEvent event){
        x = event.values[0];
        y = event.values[1];
        z = event.values[2];
        mLowPassX = lowPass(x,mLowPassX);
        mLowPassY = lowPass(x,mLowPassY);
        mLowPassZ = lowPass(x,mLowPassZ);
        }
        private float lowPass(float current,float last){
        return last * (1.0f - ALPHA) + current * ALPHA;
        }

         

        02

        抽取突變采用上面加權平滑的逆算法

         

         

        實現代碼如下:

        public void onSensorChanged(SensorEvent event){
        final float ALPHA = 0.8;gravity[0] = ALPHA * gravity[0] + (1-ALPHA) * event.values[0];
        gravity[1] = ALPHA * gravity[1] + (1-ALPHA) * event.values[1];
        gravity[2] = ALPHA * gravity[2] + (1-ALPHA) * event.values[2];filteredValues[0] = event.values[0] - gravity[0];
        filteredValues[1] = event.values[1] - gravity[1];
        filteredValues[2] = event.values[2] - gravity[2];
        }

         

        03

        簡單移動平均線

         


        保留傳感器數據流中最近的K個數據,返回它們的平均值。k表示平均“窗口”的大小;

         

        實現代碼如下:

        public class MovingAverage{
        private float circularBuffer[]; //保存傳感器最近的K個數據
        private float avg; //返回到傳感器平均值
        private float sum; //數值中傳感器數據的和
        private float circularIndex; //傳感器數據數組節點位置
        private int count;public MovingAverage(int k){
        circularBuffer = new float[k];
        count= 0;
        circularIndex = 0;
        avg = 0;
        sum = 0;
        }
        public float getValue(){
        return arg;
        }

        public long getCount(){
        return count;
        }
        private void primeBuffer(float val){
        for(int i=0;i<circularbuffer.length;++i){
         circularBuffer[i] = val;
        sum += val;
        }
        }
        private int nextIndex(int curIndex){
        if(curIndex + 1 >= circularBuffer.length){
        return 0;
        }
        return curIndex + 1;
        }
        public void pushValue(float x){
        if(0 == count++){
        primeBuffer(x);
        }
        float lastValue = circularBuffer[circularIndex];
        circularBuffer[circularIndex] = x; //更新窗口中傳感器數據
        sum -= lastValue; //更新窗口中傳感器數據和
        sum += x;
        avg = sum / circularBuffer.length; //計算得傳感器平均值
        circularIndex = nextIndex(circularIndex);

        傳感器3種常用算法處理,收藏!

        返回上一步
        打印此頁
        • 下一篇:沒有了
        18155015988

        1. <tbody id="h1zu3"><div id="h1zu3"></div></tbody>
            波多野结衣中文字幕在观线看,香蕉视频在线观看污片,欧美TV一中文字暮,亚洲色,图欧美丝袜,欧洲日产国码v大全,国产自产2019最新国产区