İstenmeyene Göğüs Gerenler : Filtreler – 2 – Bilinear Z Transform (Tustin Transform)

  • 3 ay önce, Baran EKREM yazdı.
  • 0 Yorum
  • 460 Kişi Okudu


Yine bolca matematik içeren bu yazıda filtrelerin dijital hallerine giriş yapacağız. Özellikle dijital kontrolün kalbi olan bu filtreler beraberinde çözülmesi gereken bir takım sorunları da yanında getirecek. Bir analog filtrenin dijital karşılığını modelleyeceğimiz bu yazının aklımızdaki bir çok soru işaretini gidereceğini düşünüyorum. Matematiksel dönüşümler, bilgisayar analizleri ve programlama kısmında yapılan optimizasyonlar gibi konulara da değineceğimiz bu yazıda yapılacak çok iş var. Hazırsanız başlayalım.

Öncelikle ortadaki problemi belirleyelim. Bu problem analog devrelerde kullandığımız filtrelerin dijital ortamlarda modellenebilmesi. Biraz daha açacak olursak amacımız R-L-C gibi elemanlar ile tasarlanan analog filtrelerin dijital ortamlardaki karşılığını oluşturmak. Bildiğiniz üzere R-L-C gibi elemanların henüz bir dijital karşılığını bilmiyoruz. Bu elemanların matematiksel karşılıklarını bulabilirsek sayısal ortamlarda filtreleri gerçekleyebiliriz. Öncelikle örneklerimizi pasif RC filtreler üzerinden yapacağımızı belirtelim. Öğreneceğimiz teknik ile daha sonra bir çok analog modeli sayısal ortama taşıyabileceğimiz düşünüyorum. İşe Laplace dönüşümünü kullanarak başlayacağız. Bir önceki yazıda alçak geçiren filtrenin S düzlemindeki karşılığını bulmuştuk bu yüzden bu adımları tekrar etmeyeceğim. S düzleminde bu basit işi anlayıp tamamladıysanız artık Z düzlemine geçebiliriz. Burada kullanacağımız yapının adı literatürde “Bilinear Z Transform” olarak geçiyor. Aslında daha az bilinen adıyla “Tustin Transform” olarak da görebilirsiniz. S düzleminde Z düzlemine yapacağımız bu çok sert geçişte bilmemiz gerek S yerine ne yazacağımızdır.  Bilinear Z Dönüşümü bize S yerine aşağıdaki ifadeyi yazmamızı söyler.


Burada T bizim örnekleme periyodudur. Cebirsel açıdan bizi uğraştıracak gibi gözükse de transfer fonksiyonlarında V(s), Z düzlemine direk olarak V(z) olarak geçmektedir. İlk örneğe bir alçak geçiren pasif RC filtre ile başlayalım.


S yerine yukarıdaki özdeşliği yazalım.


Asıl işlemler burada başlıyor. Bu noktada aradığımız şey şu tarzda bir denklem.


Aradığımız bu denklemin sağ tarafında Vo(z) olması şart değil fakat Vin(z) olması gerekiyor. Gerekli cebirsel düzenlemeleri buna göre yapmalıyız. Gerekli işlemleri aşağıda yaptım ve sonunda aradığımız tarzda bir denklem elde ettim.


Bu noktada artık ayrık zamana geçebiliriz.


Bu eşitlikleri yerine yazdığımızda şunu elde ederiz.


Burada y[n] çıkış değeri, x[n] filtrelenecek değerlerdir. Bu denklemi yazılıma ekleyip uygun RC değerleri vererek istediğiniz frekansı elde edip filtreleme işlemini yapabilirsiniz. Ben Python dilinde gerekli testleri yaptım. Hazır matematiksel fnksiyonlar, tek satırda FFT işlemini gibi kolaylıklar ile analiz için hızlı bir çözüm sunan Python arayüz açısından da QT Designer ile birlikte gayet başarılı çıktılar verebiliyor.

Test Değerleri;

  • R = 1K
  • C = 100nF
  • Örnek Sayısı = 8192
  • Ts = 0.00012207031 (1/8192)
  • Giriş Sinyali : sin(2*pi*f*t)
  • Fc ~ 1.6 kHz (1/(2*pi*R*C))

Giriş sinyalinin frekansı 50 Hz için;


Giriş sinyalinin frekansı 1 kHz için;


Bu noktada filtrenin devreye girmeye başladığını ve genliğin düşmeye başladığını görebilirsiniz. Ayrıca FFT çıktısında ki büyüklük normal sinyalin genliğinin yarısıdır. FFT işleminde sadece pozitif değerleri aldık.

Giriş sinyalinin frekansı 2 kHz için;


Son olarak 3.5 kHz için çıktıyı görelim.


Görüldüğü gibi 3.5kHz için genlik yaklaşık olarak 0.14 civarı. Dahaya yüksek değerler için bileşen iyice bastırılmaya başlayıp akabinde çok küçülüp yok olacak. Şimdi 3 bileşenli bir sinyali test edelim.

Giriş sinyali : sin(2*pi*1000*t) + sin(2*pi*2000*t) + sin(2*pi*3000*t)


Her şey yolunda gözüküyor değil mi ? Öyle gözükse de şuan anlayamadığımız bir problem var.

Bilinear Z dönüşümünde “Frequency Warping” denen bir problem mevcut. Bu sorun yüksek frekanslarda daha çok görülür. “Frequency Warping” denen kavram aslında istediğimiz analog filtrenin kesim frekansının dijital ortama taşınınca bozulmasıdır diyebiliriz. Güzel haber bu bozulma hesaplanabilir.


Burada dijital frekansı bulabilmek içi ters dönüşüm uygulayalım. Unutmadan burada frekansların açısal frekans olduğunu unutmayın. Ayrıca hesaplamaları yaparken Derece-Radyan moduna dikkat edin.


Uygulamasını yaptığımız Ts = 1/8192 ve Fc ~ 1.6 kHz için analog frekansımızı yerine yazdığımızda dijital frekansı 1428.95 yani ~ 1.42 kHz olarak buluruz. İki değer arasında yaklaşık olarak 163 Hz var. Bu değer küçük frekanslarda göz ardı edilebilecek olsa bile büyük frekanslarda istenmeyen hata paylarının oluşmasına sebep olur. Bu yüzden hesaplamaları yaparken bu formülü dikkate almak gerekir.

Bu işi yapan Python kodu aşağıdadır.

Özellikle filtrenin katsayılarına dikkat edecek olursanız MCU gibi yapılarda bu katsayıların optimize edilmesi gerekiyor. Çünkü hız sinyal işlemede en önemli faktördür. İşlemcinin Fixed yada Floating point olması durumuna göre farklı optimizasyonlar gerekebilir. İlerleyen yazılarda bir uygulama yapmayı planlıyorum. FIR-IIR gibi bir çok başlık altında tonlarca filtre çeşidi var. Zamanı geldikçe hepsine teker teker gireceğiz ve böylece kafalardaki soru işaretlerini gidereceğiz. Şimdilik bu kadar.

Esen kalın.

Bir Yorum Yazın