Signal Processing

SciPy’nin signal.butter ile Butterworth Filtreleri Tasarlama

Spread the love

SciPy kütüphanesi bilimsel hesaplama için güçlü bir kaynaktır ve scipy.signal modülü sinyal işleme için kapsamlı araçlar sağlar. Filtreleme, sinyal işlemenin temel bir yönüdür ve Butterworth filtreleri, geçiş bandında maksimum düz genlik tepkilerine sahip olmaları nedeniyle sıklıkla kullanılır. Bu makale, SciPy içinde bu filtreleri tasarlamak için önemli bir araç olan scipy.signal.butter fonksiyonunu ayrıntılı olarak ele almaktadır.

İçerik Tablosu

Butterworth Filtrelerini Anlamak

Butterworth filtreleri, geçiş bandında maksimum düz genlik tepkilerine sahip olmalarıyla bilinir. Bu özellik, istenen frekans aralığında minimum sinyal bozulmasını sağlar. Bununla birlikte, bu düzlemlik, durdurma bandında (filtre sinyalin zayıflattığı frekans aralığı) nispeten kademeli bir düşüş pahasına gelir. Daha dik bir düşüş elde etmek için daha yüksek bir filtre derecesine ihtiyaç duyulur.

scipy.signal.butter Kullanımı

scipy.signal.butter fonksiyonu, SciPy’da Butterworth filtreleri tasarlamak için birincil araçtır. Ana parametreleri şunlardır:

  • N: Filtre derecesi. Daha yüksek dereceler daha dik bir düşüş sağlar ancak karmaşıklığı ve potansiyel kararsızlığı artırır.
  • Wn: Kesme frekansı (veya bant geçiş ve bant durdurma filtreleri için frekanslar), Nyquist frekansına (örnekleme hızının yarısı) göre normalize edilmiştir. 0.5 değeri, örnekleme hızının yarısını temsil eder.
  • btype: Filtre tipi: ‘lowpass’, ‘highpass’, ‘bandpass’ veya ‘bandstop’.
  • analog: True analog bir filtre tasarlar; False (varsayılan) dijital bir filtre tasarlar.
  • output: Çıktı biçimini belirtir. ‘ba’ (pay ve payda katsayıları) ve ‘sos’ (ikinci dereceden kesitler) yaygın seçeneklerdir. Özellikle yüksek dereceli filtrelerde sayısal kararlılık için ‘sos’ genellikle tercih edilir.

Örnek: Alçak Geçiren Butterworth Filtresi Tasarlama

100 Hz örnekleme hızını varsayarak, 10 Hz kesme frekansına sahip 4. dereceden bir alçak geçiren Butterworth filtresi tasarlayalım:


import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# Örnekleme hızı
fs = 100  # Hz

# Kesme frekansı (normalize edilmiş)
cutoff = 10 / (fs / 2)  # Nyquist frekansına göre normalize et

# Filtre derecesi
order = 4

# Kararlılık için SOS kullanarak filtreyi tasarlayın
sos = signal.butter(order, cutoff, btype='lowpass', analog=False, output='sos')

# SOS yazdır
print("İkinci dereceden kesitler (sos):", sos)

Örnek: Filtreyi Uygulama ve Görselleştirme

Filtreyi uygulamak ve sonuçları görselleştirmek için:


# Örnek sinyal
t = np.linspace(0, 1, fs, endpoint=False)
sig = np.sin(2 * np.pi * 20 * t) + np.sin(2 * np.pi * 5 * t)

# Filtreyi uygula
filtered_sig = signal.sosfilt(sos, sig)

# Orijinal ve filtrelenmiş sinyalleri çiz
plt.figure(figsize=(10, 6))
plt.plot(t, sig, label='Orijinal Sinyal')
plt.plot(t, filtered_sig, label='Filtrelenmiş Sinyal')
plt.xlabel('Zaman (s)')
plt.ylabel('Genlik')
plt.title('Orijinal ve Filtrelenmiş Sinyal')
plt.legend()
plt.grid(True)
plt.show()

Sonuç

scipy.signal.butter, Butterworth filtreleri tasarlamak için güçlü bir araçtır. Parametrelerini anlamak ve sayısal kararlılık için ‘sos’ çıktısını kullanmak, sinyal işleme iş akışlarınızda etkili filtre tasarımı için çok önemlidir. Kesme frekanslarını Nyquist frekansına göre normalize etmeyi unutmayın. Matplotlib kullanarak filtre yanıtlarını görselleştirmek, anlayışı artırır ve performans analizine olanak tanır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir