Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: Maxim - 20 Ekim 2013, 09:56:25

Başlık: Sonsuz ortalama alma?
Gönderen: Maxim - 20 Ekim 2013, 09:56:25
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
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 20 Ekim 2013, 10:25:41
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.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: t2 - 20 Ekim 2013, 10:28:01



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.


Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Icarus - 20 Ekim 2013, 10:52:19
http://en.wikipedia.org/wiki/Moving_average (http://en.wikipedia.org/wiki/Moving_average)
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 20 Ekim 2013, 11:07:41
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.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: hasankara - 20 Ekim 2013, 11:18:12
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
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: muhittin_kaplan - 20 Ekim 2013, 11:20:26
http://muhittinkaplan.com/2012/02/unutulan-gecmis/ (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 (https://www.picproje.org/index.php/topic,43892.msg321380.html#msg321380)
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: berat23 - 20 Ekim 2013, 12:30:02
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.


Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 13:15:22
Toplam=Toplam+Yeni
n=n+1
Ortalama=Toplam/n

Bu gormuyormu isini?

Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 20 Ekim 2013, 13:20:34
Alıntı yapılan: muhittin_kaplan - 20 Ekim 2013, 11:20:26
http://muhittinkaplan.com/2012/02/unutulan-gecmis/ (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.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: muhittin_kaplan - 20 Ekim 2013, 13:32:11
Hocam hernekadar adi oysada aalinda hafizali bir ortalama algoritmasidir.
Simple Kalman filtreside ayni isi yapar.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 13:41:46
Giris sinyaliniz surekli artis gostermiyorsa tasma olmaz.

Ortalama =Ortalama + (Yeni-Ortalama)/n

Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: SpeedyX - 20 Ekim 2013, 13:56:04
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];
}
}
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 13:58:45
Sonsuz ortalama alma (http://www.cncdesigner.com/wordpress/?p=3591)
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 20 Ekim 2013, 14:08:57
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.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 14:21:12
Verdigim yontemde tasma olusturulamaz.

Hatta soyle bir soru sorayim.

12 Bit ADC ile 1 saat boyunca olcum yapilacak ve ortalama alinacaktir.

Sinyalimizin sekli nasil olursa olsun siz karar verin. Bu islem sonucunda elde edilebilecek en buyuk ortalama nedir?  ;D
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: speak48 - 20 Ekim 2013, 14:27:06

///////// burası başlangıç/////////////////
n=0
top1=0
top2=0
k2=2;
n2=0;
/////////////////////////////////////////////

//////////////burası sonsuz döngü//////////////
if n==k2
{
k2=k2<<1
n2=n2+1;
top1= top1 >>1  + top2>>n2
top2= 0
}
else
{
n= n + 1
top1=top1
top2 =  top2 + adcinput
}
////////////////////////////////////////////////////////




sonsuz ortalama =    top1
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: bayelektronik - 20 Ekim 2013, 14:31:47
okumayı_bitirme=0;
toplam=read_adc();// 1 kez burada okuma yaptırıyoruz

while(!okumayı_bitirme) {

  toplam=toplam+read_adc();
  toplam=toplam/2;

okumayı_bitirme="istenildiği zaman birlenir ve okuma sona erer";
}

taşma sorunu olmaz toplam değişkeni float seçilirse işlem kaybıda baya bir azalır.
inşallah sorulan soruyu anlamışımdır.



Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: muhittin_kaplan - 20 Ekim 2013, 14:32:13
Z sonuc 2 uzeri 12 dir (deger devamli max dadir)
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: F.T - 20 Ekim 2013, 14:38:58
Alıntı yapılan: z - 20 Ekim 2013, 13:15:22
Toplam=Toplam+Yeni
n=n+1
Ortalama=Toplam/n

Bu gormuyormu isini?




ya hepsi bu ama beğenmiyor. ;D
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 14:39:34
@Muhittinkaplan

1 bit hata ile buldun.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 20 Ekim 2013, 14:41:01
z hocam elbette ki tasma olmaz ama bence tasmanin tersi olan sey olur. 12 bit ADC ile ortalama 4096'yi gecmez elbette ama soyle bir durum oldugunu varsayalim:
Biraz abarti olacak ama diyelim ki 100 milyon ornek topladik, hepsi de 2048. Haliyle ortalama da 2048. Simdi 100 milyon daha ornek toplayalim, bu serfer hepsi 4096 olsun. Normalde bu 200 milyon degerin ortalamasinin 3072 olmasini bekleriz. Ama bence (yeni-ortalama)/n ifadesi sifirlanacagi icin bir yerden sonra ortalama sabitlenecek ve yerinden oynamaz hale gelecek.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: muhittin_kaplan - 20 Ekim 2013, 14:43:06
Yarisma baslatalim.  Sonsuz ortalama alma isini halledelim
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 14:48:39
Muhittinkaplan sorun halledildi. Nasil halledildigini de linkini verdigim sitemde acikladim.

Alıntı yapılan: Tagli - 20 Ekim 2013, 14:41:01
z hocam elbette ki tasma olmaz ama bence tasmanin tersi olan sey olur. 12 bit ADC ile ortalama 4096'yi gecmez elbette ama soyle bir durum oldugunu varsayalim:
Biraz abarti olacak ama diyelim ki 100 milyon ornek topladik, hepsi de 2048. Haliyle ortalama da 2048. Simdi 100 milyon daha ornek toplayalim, bu serfer hepsi 4096 olsun. Normalde bu 200 milyon degerin ortalamasinin 3072 olmasini bekleriz. Ama bence (yeni-ortalama)/n ifadesi sifirlanacagi icin bir yerden sonra ortalama sabitlenecek ve yerinden oynamaz hale gelecek.

Ortalama=Ortalama+(Yeni-Ortalama)/n

Eger bolmeden kaynakli hatayi dusurmek istiyorsan

Ortalama=[(n-1)*Ortalama+Yeni]/n

n=100 milyon icin Ortalama 2048 oldu.

n+1=100000001

Ortalama=2048+(4096-2048) / 100000001

Ortalama=2048 + 2048 / 100000001

Ortalama=(2048*(100000001) + 2048) / 100000001

Bu sekilde yap.


Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: muhittin_kaplan - 20 Ekim 2013, 14:51:19
Hocam ben ortalama islemlerimi kayar noltali yada simple kalman ile yapiyorum (hafizali ortalama algoritmalari)
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 20 Ekim 2013, 14:55:46
Bence yine olmadi. Simdi de (n-1)*ortalama ifadesi o kadar buyuk olacak ki uzerine eklenen yeni'yi umursamayacak.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: speak48 - 20 Ekim 2013, 15:01:41
Alıntı yapılan: speak48 - 20 Ekim 2013, 14:27:06
n=0
top1=0
top2=0
k2=2;

if n==k2
{
k2=k2<<1
top1= top1 >>1  + top2>>n
top2= 0
}
else
{

n= n + 1
top1=top1
top2 =  top2 + adcinput

}

inceleyen oldumu
bundan iyi bulan varsa söylesin
yada eksiği varmı
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 15:02:33
@Tagli

Bunun tek aciklamasi var. Kullanilan matematik fonksiyonlarin degisken uzunlugu kisa.

Diyelimki math fonksiyonlarin bu boyutta islem yapamiyor.


0 dan 100 milyona kada islemleri agrisiz sizisiz yapiyorsun fakat 200 milyona kadar yapmaya kalkinca bolme ve carpma rutinleri yetersiz kaliyor.

O zaman;

(100 milyonun ortalamasi + ikinci 100 milyonun ortalamasi)/2 yapabilirsin.


Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: muhittin_kaplan - 20 Ekim 2013, 15:05:54
100bin(herhalde yeter) rastgele sayi uretelim ve bir excel de yayinlayalim. Sonra adim adim bunlari yazdiginiz algoritmaya uygulayalim. Bakalim oluyormu.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 15:19:53
Bosver random degerleri, 1 dan 100 bine kadar birer birer artan sayilarin ortalamasini bul.

Ortalamasini sana tami tamina soyleyebilirim.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: muhittin_kaplan - 20 Ekim 2013, 15:22:43
İstenilene gore sonuc ortalamasi onemli degil. Ara degerlerde onemli keza sonsuz sekilde denmis. Yani 99.999uncu degerin ortalamasida onemli
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: z - 20 Ekim 2013, 15:25:48
Birer birer artiyorsa 99999 u da soylerim. Hani algoritmayi test etmek kolay olur o yuzden.

Yoksa islemcinin yapacagi yuvarlama,kesme, tasma hatalarindan dolayi kimin algoritmasi dogru sonuc veriyor bilinemezki.

Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: speak48 - 20 Ekim 2013, 16:18:23
algoritmanın açılımı
o4=(a+b+c+d)/4;
o5=(o4 * 4 + e) /  5


genelleme bu ama bize hızlandırılmışı lazım o yüzden 2^nin üslerindeki değerleri ortalama alıcaz

o8=(a+b+c+d+e+f+g+h)/8;

o8=(o4 * 4 + e + f + g + h)/8;

o8=(o4 * 4)/8  + (e+f+g+h)/8;
o8= o4 /2       +  toplam2/8
ortalama8=  ortalama4 >>1  + toplam2>> log2(8 );

sonraki hesaplıyacağımız ortalama 16 32 .... 2 nin katları
işlemler integer



Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: hasankara - 20 Ekim 2013, 16:27:29
dediğim gibi denklem bu S[n+1]=( n*S[n]  + adc) /(n+1)

burda  n*S[n] burası belki hafızaya sığmayacak hale gelebilir bu sefer  /(n+1) işlemini paranteze dağıtırsak, n*S[n] bu işlemi yapmadan önce n veya S[n] değerlerinden birisi bölme işlemine tabi tutulur ve sonra çarpım yapılırsa sığma problemi aşılır.

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

bu seferde işin içine float giriyor yani hassasiyet hesaplamaları giriyor işin içine.

mesaj birleştirme:: 20 Ekim 2013, 17:04:09

1 mhz frekansında örnekler geliyor olsun 1 saniyede 1000000 örnek demek yaklaşık 2^20, her örnek 2^12 olsun . ikisini çarparsak 2^32 yani 32 bitlik bir değişkeni 1 saniye sonunda  taşırmayı başarabiliriz. atıyorum 128kb değişken saklayabilen bir mikrodenetleyicide 32000  tane 32 bitlik değişkenlerimiz var demektir. yani tüm değişkenleri yazılımsal olarak kaskat bağlarsak 2^32000 saniye boyunca tüm değişkenleri bu iş uğrunda harcayarak taşma olmadan tüm örnekleri hesaba katabiliriz.

yani uzun lafın kısası :D değişken taşması için, değişkenleri kaskat bağlarsak 0 hesap hata payı ile bahsettiğim şartlarda örnekleri hesaba katabiliriz.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: berat23 - 20 Ekim 2013, 17:59:44
ilk kez benim yazdığım algoritma istenileni yapar, taşma gibi bir sıkıntısı da yok. tek sorun kümülatif olduğundan dolayı ortalamanın anlamsızlaşması ki zaten bu problemin doğal durumu.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: 1nsane - 21 Ekim 2013, 03:02:41
Sonsuz süreli ortalama alamazsınız sıfır kayıp ile.

Sayıların toplamı / sayı adedi

İkisinide bilmek zorundasınız. Donanım olarak limitleniyorsunuz. Bir nokta gelecek ve sayıların toplamını saklayamayacaksınız. Gene aynı şekilde kaçıncı sayıda olduğunuzuda.

mesaj birleştirme:: 21 Ekim 2013, 03:39:26

Diyelimki sınırsız kaynağımız var. O zamanda şudur :

Yeni ortalama = ((O anki ortalamanız X kaçıncı sayıda olduğunuz-1) + ölçüm) / kaçıncı sayıda olduğunuz

Örneklemek gerekirse
İlk sayı 1. ((0 x 0) + 1) / 1 = 1
İkinci sayınız 2 olsun. ((1 x 1) + 2) / 2 = 1.5
Üçüncü sayınız 3 ((1.5 x 2) + 3) / 3 = 2
Dördüncü sayınız 4 ((2 x 3) + 4) / 4 = 2.5
Beşinci sayınız 5 ((2.5 x 4) + 5) / 5 = 3
...

Dediğim gibi. Önceki ortalamayı bilmek lazım. Kaçıncı sayıda olduğunuzu bilmek lazım.

RTC uygulaması ile işler kolaylaşır. Kaçıncı ölçümde olduğunuzu bilirsiniz. Dakikalık, saatlik, günlük, haftalık... ortalamaları bir değişkende saklarsınız. Yeni dakikaya geçince dakika ortalamasını güncellersiniz. Yeni saate geçince saat ortalamasını. Kolaylık sağlar.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Maxim - 21 Ekim 2013, 08:31:36
arkadaşlar gerçekten elinize sağlık ilgilendiniz, teşekkürler.

fakat taktir edersinizki benim kafa karıştı, ortada anlaşabildiğiniz net bir sonuç çıkmadı
hatta birçok arkadaş olmaz diyor, bazıları işte çözüm bu diyor

ben şuna inanıyorum
bir şeyi yapmabilmenin birkaç farklı yöntemi vardır hep.

yanlış anlamadıysam @z üstadın çözümüde dahil olmak üzere
bütün çözümler ağır bir hafıza yükü gerektiren formüllere dayanıyor
haklı olarak geçmiş değer ve geçmiş zamanın bir şekilde akılda tutulması gerekmekte

şöyle birşeyin olabilitesi nedir sizce?
minimum değeri biriyoruz "0", max değerimizde belli "1023" 10bit yani, yada "5.0" volt
zamanıda bilelim, ortalama almaya başladığımız an atıyorum saat 10:32:25. saniye olsun ve bunu kayıt edelim
ve rtc saymaya devam ediyor.

X-Y ekseninde hayali yatay bir çizgi düşünelim
bu çizgimiz min-max -başlangıç zamanı ve o anki zamana göre yer değiştirsin
sanki eğri uydurma formülü gibi
bu şekilde tüm değerleri bilmek yerine bu bizim çizgimizin o anda denk geldiği yer sayesinde bir sonuca varılamazmı?
bağışlayın saçmalıyorda olabilirim

sonuçta iş görecek çözümü pic üzerinde kod oluşturmam gerekecek
ben proton plus kullanıcısıyım
protonda yeni bir yardımcı ek var NBitsMath diye
gerekirse çok çok büyük sayılar ile de çalışabilirim, açıklaması şöyle

With NBitsMath you can now calculate in values from 8 to 31 bytes wide as opposed to the 4 byte width of a Dword.
Thats a maximum calculation value of: 452,312,848,583,266,388,373,324,160,190,187,140,05 1,835,877,600,158,453,279,131,187,530,910,662,655.


Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 21 Ekim 2013, 09:30:32
O zaman sadece tamsayılarla bile çalışabilirsin kolaylıkla. Çok da fazla hafıza gerekmeyecek. 8 byte'lık bir tamsayı 2^64 = 1.84e19 civarına kadar tutabilir. Şimdi bir de en fazla nereye kadar gidebileceğimize bakalım. Saniyede 1 milyon örnek alsak ve buna 10 gün devam etsek, tüm örnekler 1024 olsa bile (aslında en fazla 1023 olur) e6*24*3600*10*1024 = 8.85e14 yapıyor. Fazlasıyla yeterli. Örnek sayısı da 8.64e11 gibi olur. Bunun için de yine 5 veya 6 byte'lık bir tamsayı tanımlamak yeterli olur. Onsan sonra ne zaman gerekirse tek bir tamsayı bölmesi ile sonuç elde edilir. Elbette bölme sonunda yine ufak bir hata olacaktır ama en azından hatada birikme olmayacağı garanti edilebilir. Bence kayar noktalı sayılar kullanımı yerine böyle bir yöntem daha iyi çünkü kayar noktalı sayılar ile hata birikmesi olabileceğini düşünüyorum.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: berat23 - 21 Ekim 2013, 15:12:50
Alıntı yapılan: Maxim - 21 Ekim 2013, 08:31:36
arkadaşlar gerçekten elinize sağlık ilgilendiniz, teşekkürler.

fakat taktir edersinizki benim kafa karıştı, ortada anlaşabildiğiniz net bir sonuç çıkmadı
hatta birçok arkadaş olmaz diyor, bazıları işte çözüm bu diyor

ben şuna inanıyorum
bir şeyi yapmabilmenin birkaç farklı yöntemi vardır hep.

yanlış anlamadıysam @z üstadın çözümüde dahil olmak üzere
bütün çözümler ağır bir hafıza yükü gerektiren formüllere dayanıyor
haklı olarak geçmiş değer ve geçmiş zamanın bir şekilde akılda tutulması gerekmekte

şöyle birşeyin olabilitesi nedir sizce?
minimum değeri biriyoruz "0", max değerimizde belli "1023" 10bit yani, yada "5.0" volt
zamanıda bilelim, ortalama almaya başladığımız an atıyorum saat 10:32:25. saniye olsun ve bunu kayıt edelim
ve rtc saymaya devam ediyor.

X-Y ekseninde hayali yatay bir çizgi düşünelim
bu çizgimiz min-max -başlangıç zamanı ve o anki zamana göre yer değiştirsin
sanki eğri uydurma formülü gibi
bu şekilde tüm değerleri bilmek yerine bu bizim çizgimizin o anda denk geldiği yer sayesinde bir sonuca varılamazmı?
bağışlayın saçmalıyorda olabilirim

sonuçta iş görecek çözümü pic üzerinde kod oluşturmam gerekecek
ben proton plus kullanıcısıyım
protonda yeni bir yardımcı ek var NBitsMath diye
gerekirse çok çok büyük sayılar ile de çalışabilirim, açıklaması şöyle

With NBitsMath you can now calculate in values from 8 to 31 bytes wide as opposed to the 4 byte width of a Dword.
Thats a maximum calculation value of: 452,312,848,583,266,388,373,324,160,190,187,140,05 1,835,877,600,158,453,279,131,187,530,910,662,655.


nkere aynı şeyden bahsetmeyisevmiyorum ama mesajım arada kaynadı galiba.benim söylediğim algoritmada sadece kaçıncı örneği aldığını ve bir önce hesapladığınız ortalamayı hatırlamanız lazım. öyle devasa toplamlar çarpımlar yok,sadece belirli bir sayıdan sonra değişim büyük değilse ortalamaya katkısı olmadığından bölme kısmı anlamsızlaşıyor ki zaten bu sonsuz ortalama almanın gerçek fiziksel problemi.

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

sonraki ortalamalar;
m2= m1+(x3-m1)/(gelen_sayının_sayısı)

algoritma bu. recursive biçimde hesaplanıyor. aslında tam istediğiniz gibi zira her sayı geldiğinde ortalamayı ne kadar değiştirdiğini hesaplıyor.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 21 Ekim 2013, 15:19:26
berat23, mesajını daha önce de görmüştüm. z de aynı şeyi söylüyor zaten. Ancak bu yöntemi neden sevmediğimi daha önce belirttim. Hatta söz konusu olası sorunu sen de farketmişsin zaten.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: berat23 - 21 Ekim 2013, 15:59:50
tagli, o durum yöntemin sorunu değil, sonsuz ortalama almanın sorunu.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Tagli - 21 Ekim 2013, 16:27:18
Elbette, örnek sayısı arttıkça yeni gelen değerin etkisinin 0'a yaklaşması beklenen bir durum. Ama bir sayfa önce bir örnek vermiştim, belki gözden kaçmıştır. 100 milyon tane 2048 ardından 100 milyon tane 4096 gelse bu 200 milyon sayının ortalamasının beklendiğinin aksine 3072 olmayacağını söylemiştim. Bu aslında çok da uç bir örnek değil. Saniyede 1 milyon örnek alınabilir, bunu destekleyen PIC modelleri var. Bu durumda 2 dakika içinde sonuçlar bozulmaya başlayabilir. Elbette bu durum kullanılan kayar noktalı sayının hassasiyeti ile ilgili ve bu konuda yanılıyor olabilirim. Belki 2 dakika sonra değil 2 saat sonra sorun çıkmaya başlayacak. Ama sistemin ne kadar çalışacağını bilmiyorum. Belki 10 gün çalışması gerekecek ama 2. günden sonra sorun çıkacak ve sonraki 8 günün değerleri ortalamaya katılmayacak, bilemem.

Özetle, oldukça rahat bir şekilde tamsayılar ile çalışmak mümkünken, kayar noktalı sayıların şu ya da bu şekilde kullanılmalarını riskli buluyorum.

Sayfalardır aynı şeyleri tekrarlayıp duruyoruz, aynı şeyler farklı kişiler tarafından tekrar tekrar dile getiriliyor. Kimse zaten çok da farklı birşey söylemiyor. Korkarım bu başlığa katabileceğim daha birşey kalmadı. Artık isteyen istediği gibi çözsün.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: 1nsane - 21 Ekim 2013, 19:53:36
Bu kadar hassas ortalama ne tarz bir uygulama için lazımki?
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: Maxim - 21 Ekim 2013, 21:11:58
aslinda arkadaslar cok uç noktalarda dusunuyorlar.
mesela taglinin dedigi gibi saniyede 1 milyon ornek cok uçuk.

aslinda nerede kullanirim bilmiyorum
ama bu tarz bir algoritmaya ihtiyacim oldugunu dusundum.
uzun sureli gunler surebilecek log almada, performans yada verimlilik degerlendirmelerinde kullanirim.
bir sensor verisi, sicaklik yada pwm sinyalleri olabilir.

o yuzden saniyede 50 ornek bile cok bence
saniyede 20 bile yeterli olabilir cogu zaman
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: muhittin_kaplan - 21 Ekim 2013, 21:41:06
test ettim 100 derinlikli bir kayan noktalı ortalama ile neredeyse aynı değerler alınıyor.


mesaj birleştirme:: 21 Ekim 2013, 21:54:47

vb.net ile 0-1023 arası sayılar rastgele üretilerek alınmış değerlerdir.

aritmatik ortalama değerleri:

işleme alınan Değer Sayısı (Burada Ölçüm Değeri): 5737
İşleme Alınan Değerlerin Toplamı: 2 938 630
Aritmatik Ortalama: 512,2244

Kayan Noktalı Ortalama (1000 derinlikli)
işleme alınan değerler toplamı: 513950
K.N. Ortalama:513,950





mesaj birleştirme:: 21 Ekim 2013, 21:57:31

rastgele sayı üretildiğinde 1000 den birden 3 e inebiliyor. adc ölçümünde bu olay pek yaşanmayacağından kayan nokta dahada sağlam çıkacaktır.

mesaj birleştirme:: 21 Ekim 2013, 22:15:36

Alıntı yapılan: Maxim - 21 Ekim 2013, 21:11:58
aslinda arkadaslar cok uç noktalarda dusunuyorlar.
mesela taglinin dedigi gibi saniyede 1 milyon ornek cok uçuk.

aslinda nerede kullanirim bilmiyorum
ama bu tarz bir algoritmaya ihtiyacim oldugunu dusundum.
uzun sureli gunler surebilecek log almada, performans yada verimlilik degerlendirmelerinde kullanirim.
bir sensor verisi, sicaklik yada pwm sinyalleri olabilir.

o yuzden saniyede 50 ornek bile cok bence
saniyede 20 bile yeterli olabilir cogu zaman

hocam bu hesapla saate 20*60*60=72000 kayıt alacaktır.

mesaj birleştirme:: 21 Ekim 2013, 22:17:09

Hepsi 1023 olsa 1023*72000=73 656 000 gibi bir değer yapıyor. (bir saatte)

mesaj birleştirme:: 21 Ekim 2013, 22:27:40

50 000 değer ile yapılan test. üstteki aritmatik ortalama alttaki ise Kayar noktalı.
(http://img809.imageshack.us/img809/9669/gzza.png)
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: 1nsane - 23 Ekim 2013, 15:25:31
Alıntı yapılan: Maxim - 21 Ekim 2013, 21:11:58
aslinda arkadaslar cok uç noktalarda dusunuyorlar.
mesela taglinin dedigi gibi saniyede 1 milyon ornek cok uçuk.

aslinda nerede kullanirim bilmiyorum
ama bu tarz bir algoritmaya ihtiyacim oldugunu dusundum.
uzun sureli gunler surebilecek log almada, performans yada verimlilik degerlendirmelerinde kullanirim.
bir sensor verisi, sicaklik yada pwm sinyalleri olabilir.

o yuzden saniyede 50 ornek bile cok bence
saniyede 20 bile yeterli olabilir cogu zaman

Çözüm odaklı basit mantık yürüyecek olursak bir sdcard'ın sonuna 72000 x 12 bit ( tek data ne kadarsa ) yer ayırırım. RTC ile her saat başında sondaki datayı toplar, data sayısına bölerim ( tam bir saat kayıt olmayabilir başlangıçta ) Sonra ortalamasını alır sdcard'ın başına yazarım ve sondaki dataları silerim ( sonu geçici data alanı gibi kullanırım ). Sdcard'ın sonunda 24 ( saat ) x 12 bir yer ayırırım. Gün sonu ortalamalarını buraya kaydederim. Gene istenirse hafta ay yıl yapılabilir.

Amaç şu. Küçük dataların ortalamalarını almak çok daha kolay. 72000 datanın ortalamasını almak var, 72000 x 24 ( saat ) x 365 ( gün ) sayısında datanın ortalamasını almak var. Yüksek kapasite kart ile yıllık data rahatlıkla kaydedilir. Asırlık data belki ( hesaplamaya üşendim :D )
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: engerex - 26 Ekim 2013, 23:35:12
 Genel ortalama için son okunan değeri kullanmak yerine son okunan değerlerin ortalamasını kullanmak daha doğruya yakın sonuç vermez mi?
Basitçe 1 günlük ortalamaya son okunan değeri eklemek yerine son 1 saatin ortalamasını alıp eklemek gibi. Süre yerine örnek sayısı da olabilir.
Başlık: Ynt: Sonsuz ortalama alma?
Gönderen: 1nsane - 27 Ekim 2013, 04:02:13
Alıntı yapılan: engerex - 26 Ekim 2013, 23:35:12
Genel ortalama için son okunan değeri kullanmak yerine son okunan değerlerin ortalamasını kullanmak daha doğruya yakın sonuç vermez mi?
Basitçe 1 günlük ortalamaya son okunan değeri eklemek yerine son 1 saatin ortalamasını alıp eklemek gibi. Süre yerine örnek sayısı da olabilir.

Son okunan değerin ortalamasını derken?