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
scipy.signal.butter
Kullanımı- Örnek: Alçak Geçiren Butterworth Filtresi Tasarlama
- Örnek: Filtreyi Uygulama ve Görselleştirme
- Sonuç
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.