2016-08-08 27 views
0

我正在JavaScript中使用物理,我有一個值指示「物理」世界中的聯繫人數量。這個值可以在0-6之間。問題是我波動很大。我想要的是過濾掉尖峯。說這個數字是3,然後在幾分之一秒內它變成零,然後又回到3。有關如何最好地做到這一點的任何想法?價值波動的阻尼,濾除峯值

+0

我們是否在談論隨着時間推移測量的數據?你能把它處理成一個數組嗎?也許最重要的是,關於它有多少數據? – Programmer1994

+0

不,它不是一個數組,它是一個變化超時的變量,我使用請求幀動畫每秒鐘60次監視它。所以是的,這是關於隨着時間的推移測量的數據:) – arpo

+1

你不能在中間放置一個過濾器方法,它會接收一系列的數字,然後刪除所有與平均值差別很大的值? – Programmer1994

回答

0

感謝@ Yves-Daoust指出我在中值過濾器的方向。

更多在這裏:https://www.youtube.com/watch?v=xFaddafLbcg

我做了一個類誰比誰有同樣的問題。 查看:

MedianFilter = function (size) { 

    var that = this; 
    that.vales = []; 
    that.sorted = []; 
    that.size = size || 7; 
    that.middelIndex = Math.round(that.size/2); 

}; 

MedianFilter.prototype = {}; 

MedianFilter.prototype.input = function (val) { 

    var that = this; 

    //If it's empty fill it up 
    if (that.vales.length === 0) { 
     that.fill(val); 
     return val; 
    } 

    //Remove last 
    that.vales.shift(); 
    //Add new value 
    that.vales.push(val); 

    //Sort 
    that.sorted = that.vales.slice(0); 
    that.sorted = that.sorted.sort(function (a, b) { return a - b; }); 
    //return medium value 
    return that.sorted[that.middelIndex]; 

}; 

MedianFilter.prototype.fill = function (val) { 

    var that = this; 
    if (that.vales.length === 0) { 
     for (var i = 0; i < that.size; i++) { 
      that.vales.push(val); 
     } 
    } 

}; 

//Usage 

var toucheFix = new MedianFilter(10); //Number is size of array to get median value from, default 7 
var val = toucheFix.input(touches); //Apply a median filter to this to make it more stable 
3

一個很好的擬合可以是滑動窗口中的中值濾波器。考慮最後的N個值,其中N至少是下降持續時間的兩倍。然後你的濾波值就是N的中值。你可以永遠重複N個樣本移動一個位置。

由於您的值在很小的範圍內是離散的,所以中值算法將非常簡單。您保留七個可能值的直方圖,即七個計數器。每當你移動一個位置時,倒數最舊的值並計算新的值。中值是累計計數達到N/2。

會有一定的慣性,即真正的變化需要一定的時間才能得到確認,但這是不可避免的,因爲任何算法都需要確認永久性變化與臨時性下降。

+0

這是一個奇妙的解決方案。謝謝! – arpo