2012-07-14 20 views
5

Hızlı/verimli bir medyan filtresinin Ansi C uygulaması için arıyorum. Herhangi bir işaretçi?Medyan Filtre Süper verimli uygulama

Şimdiye kadar following uygulamasını buldum, bu da iyi ama ben daha hızlı olanları merak ediyorum. Sadece 1 boyuta ihtiyacım var.

cevap

11

Çok gürültülü CPU tüketim verisinden sinyal almam gerekiyordu. İşte Jeff McClintock medyan filtresi.

Ortalama ve medyanı sıfır olarak sıfırlayın, daha sonra her bir 'inç' örneği için giriş örneğine küçük bir artışla medyan girin. Sonunda, giriş örneklerinin yaklaşık% 50'sinin daha büyük ve% 50'sinin medyandan daha az olduğu bir noktaya yerleşecektir. Artışların boyutu gerçek medyanla orantılı olmalıdır. Gerçek medyanı bilmediğimizden, ortalamayı kaba bir tahmin olarak kullanırım. Adım büyüklüğü, tahminin 0,01 katı olarak hesaplanır. Daha küçük adım boyutları daha doğrudur, ancak yerleşmek için daha uzun sürer. Bu çözelti çok etkili olsa da

float median = 0.0f; 
float average = 0.0f; 

// for each sample 
{ 
    average += (abs(sample) - average) * 0.1f; // rough running average magnitude. 
    median += _copysign(average * 0.01, sample - median); 
} 

enter image description here

+0

aşağıdaki uyarılar dikkat: 1) yakınsama hızı sinyal genliği (farklı uzaklıklar ve genlikleri ile adım yanıtları karşılaştırın) bağlıdır, bu nedenle karşı olmuyorsa sıfıra yakın sinyal! 2) yakın sabit giriş sinyali için, 'ortalama * 0.01' genliği ve örnekleme sıklığı 3 sıklığı ile jitter'i tanıtır. 3) kısa impulslarda (orjinal olarak değil, dolayısıyla biber ve gürültü filtresi olarak popülerdir) – orzechow

+0

Evet, jitter kaldırmak için bir iyileştirme, hata sinyali (örnek - medyan) yani daha büyük değil, adım büyüklüğü (ortalama * 0.01) sınırlamak yani: std :: max (ortalama * 0.01, fabs (örnek) - medyan)). –