Sürekli Değişen Sayıyı Değerlendirme.

Başlatan HAKKITANIR, 04 Ağustos 2019, 20:39:13

HAKKITANIR

zamanla sürekli değeri değişebilen bir tam sayı var.
sayının değerinin ne zaman ne ne kadar değişeceği belli etmiyor. bir zaman aralığında sayı bazen değişmeye de biliyor. yada sayı çok ufak farklarla değişim gösterebiliyor.
ardı-ardına, peşi-peşine değişen iki değerinin kıyaslamasını yapmak istiyorum.
peş peşe gelen iki değişen değerinden, ikincisi ilk değerinin yarısından küçük veya iki katından büyükse sayının ikinci değişen değeri sallanmayıp değerlendirme dışında tutulacak. değilse değerlendirmeye alınacak.
nasıl bir yöntem izlenmelidir?

daha açık anlatımı;
sürekli rakamsal değeri değişen sayının ilk değeri a olsun. sayının ikinci değişen değeri ise b olsun.
sayının b değeri, a değerinin yarısından küçükse veya 2 katından büyükse b değeri değerlendirmeye alınmayacak.
sayının bir sonraki değişen değeri olan c ile a kıyaslanacak. bu seferde c değeri a değerinin yarısından küçük mü yoksa iki katından büyük mü buna bakılacak. bir önceki durumda b değeri a nın yarısından büyük veya anın iki katından küçükse bu durumda, a değeri atlanıp, b ile c değişimleri kıyaslanacak ve c değişimi b nin yarısından küçük mü yoksa iki katından büyük mü buna bakılacak, eğer c b nin yarısından küçük veya iki katından büyükse, bu seferde c iptal edilip b ile d değişimi değerlendirilecek, değilse b atlanıp, c ile d değeri kıyaslanacak ve döngü sürekli bu şekilde devam edip gidecek.

nasıl bir yöntem izlenmelidir. düşündüğümüz haliyle koda nasıl aktarabiliriz.

M.Salim GÜLLÜCE

#1
Alıntı yapılan: HAKKITANIR - 04 Ağustos 2019, 20:39:13zamanla sürekli değeri değişebilen bir tam sayı var.
sayının değerinin ne zaman ne ne kadar değişeceği belli etmiyor. bir zaman aralığında sayı bazen değişmeye de biliyor. yada sayı çok ufak farklarla değişim gösterebiliyor.
ardı-ardına, peşi-peşine değişen iki değerinin kıyaslamasını yapmak istiyorum.
peş peşe gelen iki değişen değerinden, ikincisi ilk değerinin yarısından küçük veya iki katından büyükse sayının ikinci değişen değeri sallanmayıp değerlendirme dışında tutulacak. değilse değerlendirmeye alınacak.
nasıl bir yöntem izlenmelidir?
daha açık anlatımı;
sürekli rakamsal değeri değişen sayının ilk değeri a olsun. sayının ikinci değişen değeri ise b olsun.
sayının b değeri, a değerinin yarısından küçükse veya 2 katından büyükse b değeri değerlendirmeye alınmayacak.
sayının bir sonraki değişen değeri olan c ile a kıyaslanacak. bu seferde c değeri a değerinin yarısından küçük mü yoksa iki katından büyük mü buna bakılacak. bir önceki durumda b değeri a nın yarısından büyük veya anın iki katından küçükse bu durumda, a değeri atlanıp, b ile c değişimleri kıyaslanacak ve c değişimi b nin yarısından küçük mü yoksa iki katından büyük mü buna bakılacak, eğer c b nin yarısından küçük veya iki katından büyükse, bu seferde c iptal edilip b ile d değişimi değerlendirilecek, değilse b atlanıp, c ile d değeri kıyaslanacak ve döngü sürekli bu şekilde devam edip gidecek.

nasıl bir yöntem izlenmelidir. düşündüğümüz haliyle koda nasıl aktarabiliriz.
Mantıksal ifadelerle kıyaslayabilirsin.
if a>=(b/2) and a<=(2*b) gibi..
Ben programcı değilim ama bu kadarına aklım yeter. ::op  :du:
Daha fazlasını programcı arkadaşlar halledebilir. ::ok

ibra

"
bu seferde c değeri a değerinin yarısından küçük mü yoksa iki katından büyük mü buna bakılacak."

İfadeyi anlayamadım c değerini a ya göre kıyaslıyorsunuz ama sonucunda ne gibi bir tercih yapacağınızı izah etmiyorsunuz.
Yani
A_C5h5n5

ankyra

#3
A,b,ve c diye 2 den fazla değişken kafa karıştırır. Geçerli değere a, yeni değere b demek lazım. Eğer geçerli değer değişecekse, yeni değeri a değişkenine atıp aynı mantıksal sınamayı kullanmak lazım.

Başla
İf (a ile b yi kıyasla)
Then a=b (sadece if şartı doğru ise bu satır çalışacak)
Endif
B yi oku (b ye yeni değer)
Başla ya dön

Bu şekilde bi algoritma iş görür.

OptimusPrime

Seni dogru anladiysam median filter isini goruyor gibi. Bir goz at derim.  ::ok
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

HAKKITANIR

öncelikle görüntü işlemediğimi söyleyeyim. filtre ama nasıl yapılacak.
geçtiğimiz 2 günde daha çok inceledim ve yanlış değilsem asıl büyük sıkıntıyı da gördüm.
sıkıntının büyüğünü anlık yüksek zıplayan pik değerlerden kaynaklı olarak gördüm. öncelikle bunu halledersek diğer düşük değerleri dekarte etmeye gerek kalmayabilir gibi duruyor.
ilk mesajda biraz karmaşık yazmışım. sade bir şekilde anlatmaya çalışayım.

saniyede 50 kere değeri değişebilen bir sayı var. sayının 50 kereden fazla değerinin değişmediği kesin, ama 50 değişiminde ne kadarını farklı sayılarda kullanacağı bilinmiyor. yani sayının ne zaman ne olacağı belirsiz. bu haliyle hatalı zıplayan sonuçların arada bir geldiği de kesin görüyorum.

belirli bir zaman kriterine göre yani belirli bir zaman aralığındaki değişimleri kıyaslamaya girmeden. zamanla hiç uğraşmadan.

yalnızca sayının son iki üç veya en fazla 4 değişimiyle ilgilenerek çözüme gidilebileceğini düşünüyorum. bunu düşünmemdeki neden de sayının zıplama periyodu-süresi çok düşük değil. ve ilk başlangıçta zıplamadan bir süre düzgün sonuçlar alınabiliyor.

burada sayının değişen değerlerini bir dizi - pointere atmaya gerek kalmadan bu iş başarılabilir mi?
dizi pointer gerekmiyorsa? sayının son iki değerini kıyaslamak daha mümkün olacak gibi duruyor. son 3-4 değerlerini kıyaslamak dizisiz mümkün mü dür? kafamda birşeyler canlanıyor ama henüz uygulamada başarılı olamadım.

şimdi son 3 değere göre kıyaslamayı bir denesek iyi bir başlangıç yapmış oluruz diye düşünüyorum. 2 değer yetmeyecek gibi 4 değerde birden ağır gelebilir.

sayının son üç değerinden ilk geleni değeri a olsun bunun uygun bir değer olduğunu biliyoruz. bundan sonra gelen b ve en son gelen de c.

bu durumda sistem son üç sayıyı gecikmeli olarak uygulamaya koyacaktır. bu gecikme sorun olmaz.

önce b a nın 1,5 katından büyük mü değil mi buna bakılacak, büyükse b sayısı elenecek, değilse b sayısı asıl değer olarak kabul edilip çıkışa aktarılacak. b eleniyorsa, bu seferde a ile c sayısı aynı şekilde kıyaslanacak. doğru olan a ya göre c 1,5 kat büyükse elenecek, değilse bu sefer c çıkışa aktarılacak. c de eleniyorsa direkt a doğru olduğundan çıkışa aktarılacak.

yalnız burda sürekli bir döngü olduğundan kabul edilen doğru değerler arasında sürekli bir kayma olacak. sonuçta çıkışa aktarılan sayı bir sonraki döngüde a sayısının yerine geçmiş oluyor ve bundan sonraki iki değerle kıyaslamalar oluyor.

yazması kolay ama kodlaması benim açımdan zor. nasıl bir mantık uygulamak gerekir. kafamızdakini koda dökmek mümkün mü dür?

umarım bu sefer anlatabilmişimdir.


OptimusPrime

median i tek boyutlu dizi icinde kullanabilirsin.  ::ok
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

OptimusPrime

#7
Soyle ornek vereyim:

elindeki veri asagidaki gibi olsun (tek boyutlu bir dizi bu)

11, 16, 15, 502, 14, 17

filtrelenmis sonuc

11, 15, 16, 15, 17, 17

502 filtrelendi. Kendi verilerini buna uydur. Istedigin filtrelemeyi yapiyorsa median sana uyar.  ;)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

HAKKITANIR

sayılar sabit olsa çözüm daha kolay olacak.
sayılar yerinde durmayıp sürekli değiştiğinden dolayı işin içinden çıkamıyorum.
uyguladıklarım daha kötü netice veriyor.

C de şöyle bir şey yapmak mümkünmüdür;

unsigned long int gelensayi; // Bu gelensayi değişkeni bizim isteğimiz dışında saniyede 50 civarında değeri değişebilen bir değişken.

unsigned long int kıyasla [4] = {0,0,0,0};  // işaretsiz long integer tipinde toplam 4 elemanlı, ve tüm elemanlarının başlangıç değeri sıfıra atanan bir dizi tipinde değişken tanımlandı. Elemanlarının sıralama numarası 0,1,2 ve 3 tür.

 while(1)  içerisinde, gelensayi değişkeninin son 4 değerini sürekli olarak kıyasla dizisine aktaracağız. Aktarma dizininin 3. elemanından 0. elemanına doğru olsa daha iyi olacak. yani gelensayi değişkeninin son durumu herzaman için dizinin 3. elemanına aktarılacak. dizinin 2. elemanı gelensayi nin sondan bir önceki hali olacak. dizinin 1. elemanı ise gelensayinin sondan 2 önceki hali. dizinin 0. elemanı ise gelensayinin sondan 3 önceki hali olmuş olacak.
bu işlem saniyede 50 kez gibi sürekli döngü halinde tekrarlayacak.

sabit diziyi ilk kez tanımlayıp kullanmak zorunda kaldımda. hareketli olanını yapamadım. nasıl yapılabilir.

muuzoo

Alıntı yapılan: OptimusPrime - 07 Ağustos 2019, 18:23:02Soyle ornek vereyim:

elindeki veri asagidaki gibi olsun (tek boyutlu bir dizi bu)

11, 16, 15, 502, 14, 17

filtrelenmis sonuc

11, 15, 16, 15, 17, 17

502 filtrelendi. Kendi verilerini buna uydur. Istedigin filtrelemeyi yapiyorsa median sana uyar.  ;)

@HAKKITANIR , @OptimusPrime hocam sana ipucunu ve örneği vermiş. Ben de kaynak kod vereyim:

https://github.com/accabog/MedianFilter

Alıntı YapAn embedded friendly, fast 1D median filter algorithm implementation in C and C++

Useful for spike and noise removal from analog signals or other DSP
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

naptınbeya

Medyan filtresi sadece biraz yumuşaltma yapar. O pik değer, bir süre daha okunan değerleri etkilemeye devam eder (yani sönümlenerek devam eder). Ben olsam standart sapmaya göre çalışan bir filtre kullanırdım. Veya algoritmik olarak o değerin uygun bir değer olmadığını belirleyip atabilirsiniz, onun yerine de interpolasyonla bir değer hesaplayıp koyabilirsiniz.