Sonsuz ortalama alma?

Başlatan Maxim, 20 Ekim 2013, 09:56:25

Maxim

adc okuma yaparken ortalamasını alırız, 20 kere oku sonra onu 20 ye böl

işte aynı mantık ama sonsuz bir ortalama algoritması nasıl planlarız
realde sonsuz olmayacak elbette ama ben reset tuşuna basana kadar
belki 1 saatlik ortalama olur, belkide 3 günlük ortalama
fakat ben girişteki gerçek voltajı değil geçen süre zarfındaki tam ortalamayı görmek istiyorum

0-5 volt adc girişimizi sürekli ölçtüğümüzü düşünelim
giriş voltajımız 0 ile 5 volt arasında oynak
0.25 volt olabilir, 3.81 volta çıkabilir, 3.81 de 20 dakika kalabilir, 4.98 volta çıkabilir..
bütün hepsinin ortalaması lazım bana

selamlar

Tagli

Hocam mantık yine aynı. Belli aralıklarla ölçüm yapılacak, sonuçlar bir toplayıcıda saklanacak. Daha sonra da bu toplayıcı, o zamana kadar kaç kaç kez örnek alınmışsa ona bölünecek. Bu işlem anlık olarak da yapılabilir.

Burada karşılaşılması muhtemel bir sorun toplayıcının tamsayı olma durumunda taşma ihtimali olabilir. Toplayıcı kayar noktalı sayı ise bu durumda da toplam büyüdükçe hassasiyetini kaybeder, hatta daha da kötüsü küçük eklemeleri yutmaya başlayabilir.

Ortalamalar belki saatlik veya günlük olarak da hesaplanabilir. Mesela her saat için bulunan ortalama değerler saklanıp sonra bunların da kendi aralarında ortalaması alınabilir.
Gökçe Tağlıoğlu

t2




2 örnek sonra şöyle bir değer hesaplayalım:

S= (önceki + sonraki) /2   olsun


Üçüncü örneğe(S3)  geldiğimizde

S = (S  + S3) /2 olsun


Dördüncü örneğe(S4)  geldiğimizde

S = (S  + S4) /2 olsun


Yani her örnek geldiğinde, öncekilerden elde edilmiş S değeri ve yeni örnek ile yeni bir S değeri hesaplanıyor. ne kadar gerçekçidir? iş görür mü?  Bu yapılan işe göre değişir.




Tagli

t2, senin dediğin şekilde tüm değerlerin ortalaması olmuyor. Çünkü yeni gelen değere daha fazla değer veriyorsun. Toplamda 100 değer varsa, ilk 99'unun toplam etkisi ile son gelenin etkisi aynı oluyor. Bu bir çeşit alçak geçiren filtre gibi, kullanım alanları şüphesiz vardır ama Maxim'in istediği bu değil.
Gökçe Tağlıoğlu

hasankara

#5
2 örnek sonra şöyle bir değer hesaplayalım:

S[n]= (öncekilerin top. + sonraki) /top ornek sayisi   olsun


Üçüncü örneğe(S3)  geldiğimizde

S[3] = (2*S[2]  + adc) /3 olsun


Dördüncü örneğe(S4)  geldiğimizde

S[4] = (3*S[3]  + adc) /4 olsun

S[n+1]=( n*S[n]  + adc) /(n+1)

şimdi oldu :D

muhittin_kaplan

#6
http://muhittinkaplan.com/2012/02/unutulan-gecmis/
yukarda da verildi. kayan nokta, unutulan geçmiş.

mesaj birleştirme:: 20 Ekim 2013, 11:24:11

burada konuşmuştuk.

https://www.picproje.org/index.php/topic,43892.msg321380.html#msg321380

berat23

x: gelen örnekler, m:ortalamalar olsun;

ilk ortalama;
(x1+x2)/2=m1

sonraki ortalamalar;
m2= m1+(x3-m1)/(indis)
bu kısım döngü içinde devam eder. yalnız (x3-m1)/(indis) kısmı örnek sayısı arttıkça anlamsızlaşabilir. toplamada taşma olmadan algoritma bu.

indis, gelen örneğin indisi olacak.



z

Toplam=Toplam+Yeni
n=n+1
Ortalama=Toplam/n

Bu gormuyormu isini?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

Alıntı yapılan: muhittin_kaplan - 20 Ekim 2013, 11:20:26
http://muhittinkaplan.com/2012/02/unutulan-gecmis/
yukarda da verildi. kayan nokta, unutulan geçmiş.
Burada anlatılan "moving average". Ancak Maxim geçmişi unutmak istemiyor, gelmiş olan tüm değerlerin ortalamasını istiyor.

Alıntı yapılan: z - 20 Ekim 2013, 13:15:22
Toplam=Toplam+Yeni
n=n+1
Ortalama=Toplam/n

Bu gormuyormu isini?
Benim dediğim de buydu. Zaten başka türlü yapılmaz. Ama daha önce de bahsettiğim gibi, tamsayılarda taşmayı, kayar noktalı sayılarda ise anlamsızlaşmayı hesaba katmak ve buna göre gerekli önlemleri almak lazım. Burada bence veri toplamanın ne kadar süreceği (azami olarak) ve ne sıklıkta veri toplama yapılacağı önemli. Sistem ancak bu veriler ışığında sağlıklı olarak tasarlanabilir.
Gökçe Tağlıoğlu

muhittin_kaplan

Hocam hernekadar adi oysada aalinda hafizali bir ortalama algoritmasidir.
Simple Kalman filtreside ayni isi yapar.

z

Giris sinyaliniz surekli artis gostermiyorsa tasma olmaz.

Ortalama =Ortalama + (Yeni-Ortalama)/n

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

SpeedyX

volatile uint16_t ADC_ValArray[4];
volatile uint16_t ADCResults[4] = {0};
#define ADC_QUANT 8
void ADCFetch(void)
{
	static uint32_t VSUM[4]={0};
	u8 i;

	for(i=0;i<4;i++)
	{
		VSUM[i] += ADC_ValArray[i];
		ADCResults[i] = VSUM[i]/ADC_QUANT;
		VSUM[i] -= ADCResults[i];
	}
}

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

n'nin cok buyuk degerleri icin ifadenin sag tarafi sifirlanabilir. Gerci aslinda olmasi gereken de bu, yani yeni gelen degerin etkisi surekli olarak azalmali ama bana yine de birseyleri kaybedermisiz gibi geliyor. Verinin hassasiyeti ne derece onemli bilmiyorum ama bence tamsayilarla calisilmadigi surece veri kaybi ihtimali varligini korur. Birazcik kodlamayla gercekten cok buyuk tamsayilar elde edilebilir. Ornegin 100 byte'lik bir tamsayi olusturabilirim.
Gökçe Tağlıoğlu