[英]Using a low pass filter to calculate average?
如果我想平均計算400個數據點(來自加速度傳感器的噪聲值),可以使用這種低通函數來實現這一點嗎?
private float lowPass(float alpha, float input, float previousOutput) {
return alpha * previousOutput + (1 - alpha) * input;
}
我正在將其與將400個數據點簡單地存儲在List<float>
中進行比較,然后將它們相加並除以400。
即使alpha
值很高,我也會得到完全不同的結果。 難道我做錯了什么? 我可以使用低通濾波器來計算平均值嗎?還是簡單地計算“真實”平均值通常更好?
編輯
我的低通函數最初將float[]
作為輸入和輸出,因為我的數據來自3軸加速度計。 我將其更改為float
並刪除了內部的for
循環以避免混淆。 這也意味着現在將輸入/輸出作為原始值傳遞,因此該方法返回float
而不是直接在輸出數組上進行操作。
如果您有能力計算算術平均值(如果保持連續的總和,甚至不需要額外的存儲空間),則出於以下原因,在大多數情況下,這可能是更好的選擇。
警告:數學先行
為了將算術平均值與您使用的一階遞歸低通濾波器進行比較,讓我們從N
樣本的信號開始,其中每個樣本的值等於m
加上一些高斯方差v
。 讓我們進一步假設噪聲與樣本之間是獨立的。
計算該信號的算術平均值將為您提供均值為m
和方差為v/N
的隨機結果。
假設第一個previousOutput
初始化為零,得出低通濾波器最后一個輸出( output[N-1]
)的均值和方差,我們將得到均值m * (1 - alpha^N)
和方差v * (1-alpha)^2 * (1-alpha^(2*N)) / (1 - alpha^2)
。 可以看到的直接問題是,對於大的m
,對於真實值m
,估計的均值m * (1 - alpha^N)
可能相去甚遠。 不幸的是,當alpha
接近1時,此問題會變得更加嚴重。這是因為濾波器沒有時間將其穩定到其穩態值。
為避免此問題,可以考慮使用第一個輸入樣本初始化第一個previousOutput
。
在這種情況下,最后輸出的均值和方差為m
和v * ((1-alpha)^2*(1-alpha^(2*N-2))/(1-alpha^2) + alpha^(2*N-2))
。 這次的問題是,對於較大的alpha
,輸出方差主要由用於初始化的第一個樣本的方差決定。 在以下輸出方差比較圖中(通過輸入方差歸一化),這一點尤其明顯:
因此,在用0初始化previousOutput
時,您可能會在估計平均值中產生偏差,或者在使用第一個樣本進行初始化時,您會得到較大的殘差(比算術平均值計算要大得多)。
最后請注意,實際性能可能因您的特定數據而異,具體取決於觀察到的變化的性質。
output[]
什么output[]
? 如果它保存結果,並且您以0s初始化,那么該項將始終為零: alpha * output[i]
一般而言:
低通濾波器是一種使頻率低於某個截止頻率的信號通過並衰減高於該截止頻率的信號的濾波器。
因此,這並不是平均水平,基本上是達到特定閾值的極限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.