Elektroniğin ve bir çok mikrodenetleyici uygulamanın geneli dış dünyadan ölçüm alıp, bunu işleme üzerinedir. Süreklilik arz eden gerçek dünyadan (buna analog dünya da denebilir) dijital yani örneklemeye dayalı dünyaya geçişte, iyi bir betimleme yaparken çeşitli sorunlarla karşılaşırız; çözünürlük, örnekleme süresi, gürültüler vb.
Çözünürlük ve örnekleme süresi gibi etmenler mikrodenetleyici seçiminde dikkate alınarak belirlenirler. Fakat gürültüler önceden tahmin edilemeyeceklerinden özellikle programcılar için büyük sorunlar doğurabilmektedir.
Simülasyon Dünyasından Gerçek Dünyaya
Mikrodenetleyicilerle ilk kez uygulama yapacak kişilerin klişe sorusudur; yaptığım ölçüm devresi simülasyon ortamında mükemmel çalışırken gerçekte çalışmıyor, nedeni nedir? Elbetteki simülasyon ortamında çalışan devre gerçek ortamda çalışırken sorunlarla karşılacaktır, çünkü simülasyon ortamında tüm elemanlar ideal, tüm zamanlar keskindir. Oluşan sinyal teorik olduğundan kesin ve nettir.
Gerçek ortamda ise şebeke, kullanıyorsak SMPS’ler, cihazımızın yanında çalışan büyük motorlar ve bir çok etmen sinyalimizi bozar, istemediğimiz ölçümler almamıza neden olurlar. Bu tür etkileri azaltmanın yegane yolu ise filtrelemedir.
Smoothing Filters
Yukarıda saydığımız etkileri yok etmenin en kolay yolunun filtre kullanmak olduğunu söylemiştik. Filtreleme’de uygulanan yöntem ise ölçülmek istenen sinyal dışındaki bileşenlerin bastırılmasına dayanmaktadır. Örneğin DC gerilim seviyesinde bir sinyal ölçecek ve şebekenin bu sinyali bozmasını istemiyorsak alçak geçiren bir filtre tasarlar, köşe frekansını ise 50Hz’den düşük noktada seçerek şebekenin ölçmek istediğimiz sinyale çok fazla müdahalede bulunmasını engelleriz. Bunun gibi ölçüm yapmak istediğimiz değerlere göre low, high, band pass gibi bir çok filtre kullanarak ölçümümüzü hatasız yapmaya çalışırız.
Filteleme yaparken ise önümüzde iki yol vardır; analog ve dijital filtreleme. Analog filtrelemede LCR ve bazı durumlarda opamp kullanılarak istenmeyen frekansların bastırılması sağlanır. Eleman değerlerinin sıcaklığa göre değişkenlik göstermesi, özellikle kapasitörün ESR direnç etkisi, ömrünün az olması gibi etmenlerden oldukça fazla sorunla baş etmemizi gerekmektedir. Sisteme artı bir maliyet yüklese de yüksek güçlerde analog filtrelemeden kurtulmak mümkün değildir.
Dijital filtreleme de ise özellikle günümüzde hızları artan mikrodenetleyiciler ve ADC’ler ile daha çok ön plana çıkmaktadırlar. Özellikle ses işlemlerinde çok kullanılan dijital filtreleme, zamanla değişkenlik göstermemesi, sisteme artı bir maliyet getirmemesi gibi avantajlara sahipse de işlem gücü kaybı getirisi göz önünde alınmalıdır.
Uygulamasız Olmaz Diyenlere..
Yumuşatma ile ilgili uygulamaların çoğunun Low-Pass yani alçak geçiren bir filtre yapısında olduğunu söylemek sanırım yanlış olmaz. Günümüzde oldukça fazla yumuşatma algoritması mevcut olsa da (Additive, Savitzky–Golay, Ramer–Douglas–Peucker, Moving, Kalman..) ben bunların içinden mikrodenetleyiciye daha hızlı uyarlanması açısından üç tanesini seçtim; moving, laplace, triangular. FIR filtre yapısında olan bu algoritmaları kısaca belirtmek gerekirse;
1) Moving Averager: Moving averager yani hareketli ortalama belirli sayıda örneği alıp, basit bir FIFO yapısıyla filtrenin boyutuna göre ortalama almaktadır. Özellikle borsada çok fazla kullanılan filtrenin matematiksel ifadesini boyutu 3 olmak üzere aşağıda görebilirsiniz.
2) Laplace Averager: Hareketli ortalamadan farklı olarak Laplave Averager filtre yapısını bir FIFO tarzında kullanmaz. Örneğin filtre boyutu 10 olan bir laplace ortalama filtresi, öncelikle ilk 10 datayı toplar ve bunu 10’a bölerek ilk filtrelenmiş elemanı elde eder. Daha sonraki 10 örnek bekleme anında ise önceki filtrelenmiş değer sabit kalır. Bu bize gerçek sinyali takip etmeme gibi zorluk çıkarsa da basitlik açısından diğerlerinden avantajlıdır.
3) Triangular Averager: Üçgensel ortalama da ise aynen hareketli ortalamadaki FIFO mantığı kullanılır. Yalnız hareketli ortalamadan farklı olarak üçgensel ortalamada ölçülen değerler filtre boyutuna göre üçgen form oluşturacak katsayılar ile çarpılır ve bu katsayıların toplamına bölünür. Aşağıda 5 boyutlu üçgensel filtre için matematiksel ifade gözükmektedir.
Yukarıdaki üç filtrenin başarısı, filtre boyutu ile orantılı işlem süresi kısalığı ve küçük filtre boyutunda iyi bir filtreleme işlemi gerçekleştirmesine bağlıdır.
Örnek olarak sistemimizde okumak istediğimiz sinyal 1,5V offsetli 3Vpp genliğe sahip 50Hz sinüs sinyali olsun. Bu sinyalin üstüne ise random gürültü bindirelim.
Uygulamada 32-128 ve 2048 olmak üzere 3 filtre boyutu seçelim ve tüm filtrelerde aynı boyutları kullanalım. Kırmızılar ölçmek istediğimiz sinyali, maviler ise filtre çıkışlarını göstermektedir.
a) 32 Birim Uzunluğunda Filtre Sonuçları
b) 128 Birim Uzunluğunda Filtre Sonuçları
c) 2048 Birim Uzunluğunda Filtre Sonuçları
Sonuç Olarak..
Filtre boyutu ve gürültü bastırma oranları göz önüne alındığında triangle averager’ın diğerlerine nazaran daha iyi bir iş çıkardığı yukarıdaki resimlerden gözlemlenebilir. Filtre boyutu büyüdükçe hem moving hem de triangle averager çıkışları, ölçmek istediğimiz sinyale yaklaşmaktadır. Laplace averager ise boyut büyüdükçe basamaklı bir yapı haline gelmekte ve bizim okumak istediğimiz sinyalden uzaklaşmaktadır. Her filre filtrenin boyutu kadar sisteme bir faz farkı da eklemektedir. Gerçek ortamda sistem tasarlanırken bu faz farkının sistemi etkileyip etkilemediği incelenmeli ve buna göre filtre tasarlanmalıdır.
Herkese çalışmalarında başarılar dilerim..
Dip Not: Dijital filtre tasarlarken öncelikle sistemi z-domain’ine aktarıp, orada katsayılar bulunduktan sonra sistemin frekans cevabına bakılmalıdır. Ayrıca hangi frekansın ne kadar bastırıldığını incelemek için sinyal FFT ile açılmalı ve frekans bileşenleri ayrı ayrı incelenmelidir. Ben burada pratik açıdan sistemi incelediğim için tüm bunları göz ardı ettim.
Yaptığım uygulama ile ilgili MATLAB Dosyaları;
Şifre-Pass: 320volt.com
Yayım tarihi: 2011/11/17 Etiketler: matlab moving, smoothing algorithms, yumuşatma algoritmaları
Eline sağlık. Çok orjinal konulara açıklık getiriyosun.
Buradaki 32 128 2048 saniyedeki örnekleme adedimidir.
Fırat hoacam,
bu uyguladığın ve bahsettiğin algoritmaları anlatan DSP kaynağı önerebilirmisin?
@Hakan: 32-128-2048 filtre boyutunu belirtiyor. Teşekkürler.
@Orhan: Şu an aklımda öyle bir kaynak yok, fakat güze, referans alınabilecek bir kaynak bulursam ekleme yaparım.
Fırat hocam pic ile volt amper metre yapmak istedim fakat bir türlü lcd de okunan değeri stabil hale getiremedim, değerin ekran çıktısı sürekli değişiyor (12.1v 12.5v 13v 15v 13.2v vs gibi) aynı değeri fluke multimetre ile ölçüyorum ekranda tam 12v yazıyor, programı proton basic de yazdım ölçtüğüm değerlerin ortalamasını aldım art arda 10 ölçümü toplayıp sonucu 10 a böldüm, ölçtüğüm noktayı 100nf kondansatör ile filitre ettim. Neticede sonuç değişmedi kime sorduysam doğru fikir bulamadım bende hazır 7107li panel voltmetre alarak işimi gördüm istediğimi yapamadım ama hazır almaya mecbur kaldım.
Şimdi hocam yukarıdaki filtreleme Triangular Averager metodunu kullanarak anolog girişden okuduğum sinyali nasıl ekran çıktısını alabilirim. Formüldeki değişkenlerden n:okunan sinyal midir ve x değişkeni ne olur yani okunuan anolog sinyali (gerilim, sıcaklık, …)Triangular Averager metodunu kullanarak stabil hale nasıl getire bilirim. Beni aydınlatırsanız sevinirim.
NOT:Hocam yıllardır basicde yazıyorum okulda öğrenmiştim, bakıyorumda herkes c de yazıyor. Basic dilini önerirmisiniz ben c ye gecmek istiyorum hangi c derleyicisini öğrenmeliyim.
@Hakan: Yazılarımı takip ettiysen C18, Hi-Tech, C30 kullandığımı görmüş olman lazım. Onlardan başkasını da kimseye önermem. Triangular çok basit bir filtre; ilk değeri ölç 1 ile çarp, sonra ikinci değeri ölç 2 ile çarp, sonra ölç 3 ile çarp, sonra ölç 2 ile sonunda da ölç 1 ile çarp bunları topla ve 9′a böl. Sonrasında ise kaydırma yapacaksın. 2. ölçtüğünü 1 ile 3.’yü 2 ile 4.’yü 3 ile 5.’yi 2 ile ve şimdi yeni ölçtüğünü 1 ile çarpıp topla ve 9′a böl. Filtre boyutunu onlu yaparsan çarpan sayıların 1 2 3 4 5 5 4 3 2 1 olacak. Sanırım bundan daha fazla yardım kodu benim yazmam olur. Fluke’un kim bilir ne filtreleri vardır DC değer ölçümü için. Onun için en ucuzu 300TL’den başlıyor aletlerinin.
Anladığım kadarıyla Filtre konusunda eksiklerin var, İngilizce altyapın var ise internette filtre konusunda dersler bulup okumanı öneririm. Zaman konusunda sıkıntı çektiğim için burada hepsine değinemiyorum maalesef.
Evet filtre konusunda zayıfım, ingilizceminde yeteri kadar olmaması beni öğrenme ve kaynak tarama aşamasında çok sıkıntı yaratıyor.
Cevabın için çok teşekkür ederim. İyiki varsın.
Merhaba, yazılarınızı düzenle takip ediyorum gerçekten çok paylaşımcı ve faydalı bir site, öncelikle bu açıdan teşekkürlerimi sunayım ve şöyle bir sorum olacak; bu bahsettiğimiz triangular filtresini sistemimizde 5-6 kanalda ADC okuması gerçeklestirirken kullandığımızda sanırım PIC’e epey bir yük ve zaman kaybı getirecektir? Bu konuda ne yorum yapabilirsiniz? O götürü göz ardı edilebilir mi yoksa daha basit yöntemlere başvurmak mı gerekir?
@Hasan: Bu yaptığınız uygulamadan uygulamaya değişecektir, örneğin bir datayı okuyup, 1 saniyede bir herhangi bir işlemciye ya da bilgisayara gönderecekseniz bir sıkıntı çıkmayacaktır. Yalnız ADC’den okunan veriye göre çok hızlı işlem yapmanız gerekiyorsa elbette bir hız sorunu çıkacaktır. Bu ve bunun gibi önlemler donanımsal olarak halledildikten sonra yazılıma aktarılırlar. Örneğin bu tür bir sinyali basit RC elemanları ile oluşturacağınız filtre ile çok daha basit filtreleyebilirsiniz. Siz donanımsal önlemlere karşı sistemde hala gürültüleriniz mevcutsa ancak o şekilde yazılımsal filtrelemeye gitmelisiniz. PIC, ARM, DSP farketmez.
Yukarıda bahsettiğin işlemleri en güzel yapabilecek filtrelerden 2 tanesi median filtre ve wiener filtredir. Median filtrenin algoritması da çok kolaydır. Özellikle LM35 ile sıcaklık ölçme işlerinde çok kullanırım ben.
@Serhat: Median filtreyi yazıyı yazdıktan sonra gördüm. Onu da bir ara incelemek isterim 😉