Signal Processing

تصميم مرشحات باترورث باستخدام SciPy’s signal.butter

Spread the love

تُعد مكتبة SciPy موردًا قويًا للحوسبة العلمية، وتوفر وحدتها scipy.signal أدوات شاملة لمعالجة الإشارات. يُعتبر الترشيح جانبًا أساسيًا في معالجة الإشارات، ويتم استخدام مرشحات Butterworth بشكل متكرر نظرًا لاستجابتها السعة ذات الاتساع الأقصى في نطاق التمرير. تتعمق هذه المقالة في دالة scipy.signal.butter، وهي أداة أساسية لتصميم هذه المرشحات داخل SciPy.

جدول المحتويات

فهم مرشحات Butterworth

تشتهر مرشحات Butterworth باستجابتها السعة المسطحة بشكل أقصى داخل نطاق التمرير. تضمن هذه الخاصية الحد الأدنى من تشويه الإشارة في نطاق التردد المطلوب. ومع ذلك، يأتي هذا التسوية على حساب انخفاض تدريجي نسبيًا في نطاق الإيقاف (نطاق التردد حيث يضعف المرشح الإشارة). يتطلب تحقيق انخفاض أكثر حدة ترتيبًا أعلى للمرشح.

استخدام scipy.signal.butter

تُعد دالة scipy.signal.butter الأداة الأساسية لتصميم مرشحات Butterworth في SciPy. وتتمثل معلماتها الرئيسية في:

  • N: رتبة المرشح. تُنتج الرتب الأعلى انخفاضًا أكثر حدة، ولكنها تزيد من التعقيد واحتمالية عدم الاستقرار.
  • Wn: تردد القطع (أو الترددات بالنسبة لمرشحات النطاق الترددي ومرشحات إيقاف النطاق)، مُعيار إلى تردد نيكويست (نصف معدل أخذ العينات). تمثل القيمة 0.5 نصف معدل أخذ العينات.
  • btype: نوع المرشح: ‘lowpass’ (منخفض التمرير)، ‘highpass’ (عالي التمرير)، ‘bandpass’ (نطاق التمرير)، أو ‘bandstop’ (إيقاف النطاق).
  • analog: True يُصمم مرشحًا تناظريًا؛ False (افتراضيًا) يُصمم مرشحًا رقميًا.
  • output: يحدد تنسيق الإخراج. ‘ba’ (معاملات البسط والمقام) و ‘sos’ (الأقسام من الرتبة الثانية) خيارات شائعة. يُفضل ‘sos’ بشكل عام للاستقرار العددي، خاصةً مع مرشحات الرتب العالية.

مثال: تصميم مرشح Butterworth منخفض التمرير

لنقم بتصميم مرشح Butterworth منخفض التمرير من الرتبة الرابعة مع تردد قطع 10 هرتز، بافتراض معدل أخذ عينات 100 هرتز:


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

# معدل أخذ العينات
fs = 100  # هرتز

# تردد القطع (معيار)
cutoff = 10 / (fs / 2)  # معيار إلى تردد نيكويست

# رتبة المرشح
order = 4

# تصميم المرشح باستخدام SOS من أجل الاستقرار
sos = signal.butter(order, cutoff, btype='lowpass', analog=False, output='sos')

#طباعة SOS
print("الأقسام من الرتبة الثانية (sos):", sos)

مثال: تطبيق المرشح والتصور

لتطبيق المرشح وتصور النتائج:


# إشارة مثال
t = np.linspace(0, 1, fs, endpoint=False)
sig = np.sin(2 * np.pi * 20 * t) + np.sin(2 * np.pi * 5 * t)

# تطبيق المرشح
filtered_sig = signal.sosfilt(sos, sig)

# رسم الإشارات الأصلية والمرشحة
plt.figure(figsize=(10, 6))
plt.plot(t, sig, label='الإشارة الأصلية')
plt.plot(t, filtered_sig, label='الإشارة المرشحة')
plt.xlabel('الزمن (ثانية)')
plt.ylabel('السعة')
plt.title('الإشارة الأصلية مقابل الإشارة المرشحة')
plt.legend()
plt.grid(True)
plt.show()

الخلاصة

تُعد scipy.signal.butter أداة قوية لتصميم مرشحات Butterworth. يُعد فهم معلماتها واستخدام مخرج ‘sos’ للاستقرار العددي أمرًا بالغ الأهمية لتصميم مرشح فعال ضمن سير عمل معالجة الإشارات الخاصة بك. تذكر معايرة ترددات القطع إلى تردد نيكويست. يُعزز تصور استجابات المرشح باستخدام Matplotlib الفهم ويسمح بتحليل الأداء.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *