Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ortalama alma işlemi

Başlatan secretagent, 22 Şubat 2011, 21:30:18

frederic

Alıntı yapılan: aliveli - 04 Ağustos 2014, 22:01:33
@RcALTIN dediği radial olypic ve oldukça faydalıdır. alınan ölçümlerden en düşük ve en yüksek değerleri pik kabul edip hesaplamadan çıkarır. aşağıdaki kod c içindir basic için fikir verebilir. basic diline çeviren olursa başkasına da faydalı olacaktır.
//16 kere adcden okuma yapılır, değerler sıralanır, alttaki ve üstteki dört değer çıkarılır,ortadaki 8 değerin ortalaması alınır
unsigned int16 adchlx(void){  

 unsigned int8 i;  unsigned int16 accum=0;  
 unsigned int16 s, b[16]; int1 didswap=1; 

//bu döngü 16 kere okuma yapar ve b[] dizisine yerleştirir
   for ( i = 0 ; i < 16;  i++ ) { 
           b[i]= read_adc(ADC_start_and_read); // ADC okunur diziye  atılır
           delay_us(8);  
     } 

// bubble sort algoritması b[] dizisindeki elemanlar küçükten büyüğe sıralanır.
   while(didswap){  
     didswap=0; 
     for (i=0; i<15; i++){ // i 0-15 
      if(b[(i)]>b[(i+1)]){ // eğer değer sonrakinden büyükse sırayı değiştir 
           s=b[i]; // yükseği tut
           b[i]=b[(1+i)]; 
           b[(1+i)]=s; 
           didswap=1; // yer değiştirme işi bitince döngüden çıkartır duruma göre işlemi kısaltabilir
      } // ~if 
     } // ~for 
    } // ~while 

   //elemanları sıralanan  b[] dizisinde ortadaki 8 değerin ortalaması alınır.
   for (i=4; i<12; i++){  accum +=b[i];  } 
   return(accum>>3); 
}



burada verilen 16 , 4 değerleri isteğe göre artırılıp azaltılabilir.



Hocam bu örneğinizdeki 16 ve 4 seçeneği ile doğru sonuçlar alınıyor fakat bu değerleri değiştirdiğimizde yanlış değerler geliyor. 25 örnek alıp bunu işleyen versiyonunda yapılacak değişiklikleri gösterebilirmisiniz acaba?

aliveli

nsigned int16 adchlx(void){  

 unsigned int8 i;  unsigned int16 accum=0;  
 unsigned int16 s, b[25]; int1 didswap=1; 

//bu döngü 16 kere okuma yapar ve b[] dizisine yerleştirir
   for ( i = 0 ; i < 25;  i++ ) { 
           b[i]= read_adc(ADC_start_and_read); // ADC okunur diziye  atılır
           delay_us(8);  
     } 

// bubble sort algoritması b[] dizisindeki elemanlar küçükten büyüğe sıralanır.
   while(didswap){  
     didswap=0; 
     for (i=0; i<24; i++){ 
      if(b[(i)]>b[(i+1)]){ // eğer değer sonrakinden büyükse sırayı değiştir 
           s=b[i]; // yükseği tut
           b[i]=b[(1+i)]; 
           b[(1+i)]=s; 
           didswap=1; // yer değiştirme işi bitince döngüden çıkartır duruma göre işlemi kısaltabilir
      } // ~if 
     } // ~for 
    } // ~while 

   //elemanları sıralanan  b[] dizisinde ortadaki 8 değerin ortalaması alınır.
   for (i=4; i<21; i++){  accum +=b[i];  } 
   return(accum/17); 
}


frederic

Hocam rica etsem şu iki satırı açıklarmısınız?

for (i=4; i<21; i++){  accum +=b;  }
   return(accum/17);

aliveli

25 elemanlı dizin var ilk ve son dördü hesaplamadan çıkarılır geriye kalan 17 tanesi toplanır. toplanan değerler 17ye bölünerek ortalama bulunmuş olur.

Maxim