فیلتر کردن سیگنال با SciPy
فیلتر کردن سیگنال فرآیندی است که برای حذف نویز و سیگنال های ناخواسته از یک سیگنال دلخواه انجام می شود. این کار با استفاده از فیلترهایی انجام می شود که فرکانس های خاصی از سیگنال را عبور می دهند و فرکانس های دیگر را مسدود می کنند.
SciPy کتابخانه ای قدرتمند برای محاسبات علمی در زبان برنامه نویسی Python است که ابزارهایی را برای فیلتر کردن سیگنال در حوزه زمان و فرکانس ارائه می دهد.
در اینجا به برخی از روش های رایج فیلتر کردن سیگنال با SciPy اشاره می کنیم:
۱. فیلترهای IIR (Infinite Impulse Response):
- این فیلترها از معادلات دیفرانسیل مرتبه n برای مدل سازی رفتار سیگنال استفاده می کنند.
- فیلترهای IIR به دلیل سادگی پیاده سازی و کارایی بالا محبوب هستند.
- می توان از توابع
scipy.signal.lfilter
وscipy.signal.butter
برای طراحی و اعمال فیلترهای IIR استفاده کرد.
مثال:
فرض کنید می خواهیم یک فیلتر پایین گذر مرتبه اول با فرکانس قطع ۱۰ هرتز را برای حذف نویز فرکانس بالا از یک سیگنال صوتی اعمال کنیم.
می توانیم از توابع scipy.signal.lfilter
و scipy.signal.butter
به شرح زیر استفاده کنیم:
import scipy.signal as signal
import numpy as np
# Load audio signal
audio_signal, _ = scipy.io.wavfile.read('audio.wav')
# Design a 1st-order low-pass butterworth filter
b, a = signal.butter(۱, ۱۰ / (fs / ۲), btype='low')
# Apply the filter to the audio signal
filtered_signal = signal.lfilter(b, a, audio_signal)
# Plot the original and filtered signals
plt.plot(audio_signal)
plt.plot(filtered_signal)
plt.xlabel('Time (samples)')
plt.ylabel('Amplitude')
plt.title('Original vs. Filtered Audio Signal')
plt.legend()
plt.show()
۲. فیلترهای FIR (Finite Impulse Response):
- این فیلترها از ضرایب وزنی برای محاسبه خروجی فیلتر بر اساس نمونه های قبلی سیگنال استفاده می کنند.
- فیلترهای FIR به دلیل انعطاف پذیری بیشتر و قابلیت طراحی برای طیف وسیعی از فرکانس ها نسبت به فیلترهای IIR محبوب هستند.
- می توان از تابع
scipy.signal.filter_design
برای طراحی و اعمال فیلترهای FIR استفاده کرد.
مثال:
فرض کنید می خواهیم یک فیلتر باندگذر FIR با فرکانس های گذر ۲۰۰ تا ۵۰۰ هرتز را برای استخراج سیگنال EEG از یک سیگنال بیولوژیکی اعمال کنیم.
می توانیم از تابع scipy.signal.filter_design
به شرح زیر استفاده کنیم:
import scipy.signal as signal
import numpy as np
# Load biological signal
bio_signal = np.loadtxt('bio_signal.txt')
# Design a band-pass FIR filter
numtaps, b = signal.filter_design(۱, [۲۰۰ / (fs / ۲), ۵۰۰ / (fs / ۲)], btype='bandpass')
# Apply the filter to the biological signal
filtered_signal = signal.filtfilt(b, [۱], bio_signal)
# Plot the original and filtered signals
plt.plot(bio_signal)
plt.plot(filtered_signal)
plt.xlabel('Time (samples)')
plt.ylabel('Amplitude')
plt.title('Original vs. Filtered Biological Signal')
plt.legend()
plt.show()
۳. سایر روش های فیلتر کردن:
- SciPy توابع دیگری برای فیلتر کردن سیگنال مانند
scipy.signal.decimate
وscipy.signal.hilbert
ارائه می دهد. - می توانید از کتابخانه های دیگر مانند
pywt
برای فیلتر کردن موجک وnotchfilt
برای حذف نویز فرکانس خاص استفاده کنید.
انتخاب روش فیلتر مناسب:
انتخاب روش فیلتر مناسب به عوامل مختلفی مانند نوع سیگنال، نویز موجود، و الزامات فرکانسی فیلتر بستگی دارد.
- اگر سادگی و کارایی مهم باشد، از فیلترهای IIR استفاده کنید.
- اگر انعطاف پذیری و دقت بیشتر مورد نیاز باشد، از فیلترهای FIR استفاده کنید.
- برای فیلتر کردن موجک، از کتابخانه
pywt
استفاده کنید. - برای حذف نویز فرکانس خاص، از کتابخانه
notchfilt
استفاده کنید.
علاوه بر موارد فوق، هنگام انتخاب روش فیلتر باید به موارد زیر نیز توجه کرد:
- طول فیلتر: طول فیلتر بر دقت و پیچیدگی محاسباتی فیلتر تاثیر می گذارد.
- نوع داده: فیلترها می توانند برای سیگنال های پیوسته و گسسته اعمال شوند.
- ثبات: فیلتر باید پایدار باشد تا از اعوجاج سیگنال جلوگیری شود.
نکات تکمیلی:
- SciPy کتابخانه های دیگری برای پردازش سیگنال مانند
scipy.signal.wavelets
وscipy.signal.lti_systems
ارائه می دهد. - می توانید از نرم افزارهای تخصصی پردازش سیگنال مانند MATLAB و Simulink برای طراحی و شبیه سازی فیلترهای پیچیده تر استفاده کنید.
- منابع آنلاین بسیاری مانند مقالات علمی، کتاب ها و دوره های آموزشی برای یادگیری بیشتر در مورد فیلتر کردن سیگنال با SciPy در دسترس هستند.
کاربردهای فیلتر کردن سیگنال:
فیلتر کردن سیگنال در زمینه های مختلفی از جمله موارد زیر کاربرد دارد:
- فیلتر کردن نویز: حذف نویز تصادفی و ناخواسته از سیگنال ها.
- استخراج سیگنال: جداسازی سیگنال های مورد نظر از سیگنال های مخلوط.
- بهبود کیفیت صدا: حذف نویز و اعوجاج از سیگنال های صوتی.
- پردازش تصویر: حذف نویز و افزایش وضوح تصاویر.
- تشخیص پزشکی: تجزیه و تحلیل سیگنال های بیولوژیکی برای تشخیص بیماری ها.
- کنترل و اتوماسیون: فیلتر کردن سیگنال های حسگر برای کنترل سیستم ها.
فیلتر کردن سیگنال بخش مهمی از پردازش سیگنال است و SciPy ابزارهای قدرتمندی را برای این کار در Python ارائه می دهد.
منابع:
- مستندات SciPy – Signal Processing: https://docs.scipy.org/doc/scipy/
- آموزش پردازش سیگنال با Python و SciPy: https://www.coursera.org/
- کتاب فیلتر کردن سیگنال دیجیتال: https://www.amazon.com/Digital-Signal-Processing-William-Stanley/dp/083591321X
- مقالات علمی در مورد فیلتر کردن سیگنال با SciPy: https://www.sciencedirect.com/