import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, lfilter
# Создание временного вектора и синусоидального сигнала
fs = 500 # Частота дискретизации
t = np.linspace(0, 1, fs, endpoint=False) # Временной вектор
f1 = 5 # Частота сигнала
f2 = 50 # Частота помехи
signal
= np.
sin(2 * np.
pi * f1
* t
) + 0.5 * np.
sin(2 * np.
pi * f2
* t
)
# Функция для создания низкочастотного фильтра
def butter_lowpass(cutoff, fs, order=5):
nyquist = 0.5 * fs
normal_cutoff = cutoff / nyquist
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return b, a
# Функция для фильтрации сигнала
def lowpass_filter(data, cutoff, fs, order=5):
b, a = butter_lowpass(cutoff, fs, order=order)
y = lfilter(b, a, data)
return y
# Параметры фильтра
cutoff_frequency = 10 # Частота среза
# Применение низкочастотного фильтра
filtered_signal = lowpass_filter(signal, cutoff_frequency, fs)
# Построение графиков
plt.figure(figsize=(12, 6))
# Исходный сигнал
plt.subplot(2, 1, 1)
plt.plot(t, signal, label='Исходный сигнал', color='blue')
plt.title('Исходный сигнал')
plt.xlabel('Время [с]')
plt.ylabel('Амплитуда')
plt.grid()
plt.legend()
# Отфильтрованный сигнал
plt.subplot(2, 1, 2)
plt.plot(t, filtered_signal, label='Отфильтрованный сигнал', color='orange')
plt.title('Отфильтрованный сигнал (низкочастотный фильтр)')
plt.xlabel('Время [с]')
plt.ylabel('Амплитуда')
plt.grid()
plt.legend()
plt.tight_layout()
plt.show()
aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKZnJvbSBzY2lweS5zaWduYWwgaW1wb3J0IGJ1dHRlciwgbGZpbHRlcgoKIyDQodC+0LfQtNCw0L3QuNC1INCy0YDQtdC80LXQvdC90L7Qs9C+INCy0LXQutGC0L7RgNCwINC4INGB0LjQvdGD0YHQvtC40LTQsNC70YzQvdC+0LPQviDRgdC40LPQvdCw0LvQsApmcyA9IDUwMCAgIyDQp9Cw0YHRgtC+0YLQsCDQtNC40YHQutGA0LXRgtC40LfQsNGG0LjQuAp0ID0gbnAubGluc3BhY2UoMCwgMSwgZnMsIGVuZHBvaW50PUZhbHNlKSAgIyDQktGA0LXQvNC10L3QvdC+0Lkg0LLQtdC60YLQvtGACmYxID0gNSAgIyDQp9Cw0YHRgtC+0YLQsCDRgdC40LPQvdCw0LvQsApmMiA9IDUwICAjINCn0LDRgdGC0L7RgtCwINC/0L7QvNC10YXQuApzaWduYWwgPSBucC5zaW4oMiAqIG5wLnBpICogZjEgKiB0KSArIDAuNSAqIG5wLnNpbigyICogbnAucGkgKiBmMiAqIHQpCgojINCk0YPQvdC60YbQuNGPINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINC90LjQt9C60L7Rh9Cw0YHRgtC+0YLQvdC+0LPQviDRhNC40LvRjNGC0YDQsApkZWYgYnV0dGVyX2xvd3Bhc3MoY3V0b2ZmLCBmcywgb3JkZXI9NSk6CiAgICBueXF1aXN0ID0gMC41ICogZnMKICAgIG5vcm1hbF9jdXRvZmYgPSBjdXRvZmYgLyBueXF1aXN0CiAgICBiLCBhID0gYnV0dGVyKG9yZGVyLCBub3JtYWxfY3V0b2ZmLCBidHlwZT0nbG93JywgYW5hbG9nPUZhbHNlKQogICAgcmV0dXJuIGIsIGEKCiMg0KTRg9C90LrRhtC40Y8g0LTQu9GPINGE0LjQu9GM0YLRgNCw0YbQuNC4INGB0LjQs9C90LDQu9CwCmRlZiBsb3dwYXNzX2ZpbHRlcihkYXRhLCBjdXRvZmYsIGZzLCBvcmRlcj01KToKICAgIGIsIGEgPSBidXR0ZXJfbG93cGFzcyhjdXRvZmYsIGZzLCBvcmRlcj1vcmRlcikKICAgIHkgPSBsZmlsdGVyKGIsIGEsIGRhdGEpCiAgICByZXR1cm4geQoKIyDQn9Cw0YDQsNC80LXRgtGA0Ysg0YTQuNC70YzRgtGA0LAKY3V0b2ZmX2ZyZXF1ZW5jeSA9IDEwICAjINCn0LDRgdGC0L7RgtCwINGB0YDQtdC30LAKCiMg0J/RgNC40LzQtdC90LXQvdC40LUg0L3QuNC30LrQvtGH0LDRgdGC0L7RgtC90L7Qs9C+INGE0LjQu9GM0YLRgNCwCmZpbHRlcmVkX3NpZ25hbCA9IGxvd3Bhc3NfZmlsdGVyKHNpZ25hbCwgY3V0b2ZmX2ZyZXF1ZW5jeSwgZnMpCgojINCf0L7RgdGC0YDQvtC10L3QuNC1INCz0YDQsNGE0LjQutC+0LIKcGx0LmZpZ3VyZShmaWdzaXplPSgxMiwgNikpCgojINCY0YHRhdC+0LTQvdGL0Lkg0YHQuNCz0L3QsNC7CnBsdC5zdWJwbG90KDIsIDEsIDEpCnBsdC5wbG90KHQsIHNpZ25hbCwgbGFiZWw9J9CY0YHRhdC+0LTQvdGL0Lkg0YHQuNCz0L3QsNC7JywgY29sb3I9J2JsdWUnKQpwbHQudGl0bGUoJ9CY0YHRhdC+0LTQvdGL0Lkg0YHQuNCz0L3QsNC7JykKcGx0LnhsYWJlbCgn0JLRgNC10LzRjyBb0YFdJykKcGx0LnlsYWJlbCgn0JDQvNC/0LvQuNGC0YPQtNCwJykKcGx0LmdyaWQoKQpwbHQubGVnZW5kKCkKCiMg0J7RgtGE0LjQu9GM0YLRgNC+0LLQsNC90L3Ri9C5INGB0LjQs9C90LDQuwpwbHQuc3VicGxvdCgyLCAxLCAyKQpwbHQucGxvdCh0LCBmaWx0ZXJlZF9zaWduYWwsIGxhYmVsPSfQntGC0YTQuNC70YzRgtGA0L7QstCw0L3QvdGL0Lkg0YHQuNCz0L3QsNC7JywgY29sb3I9J29yYW5nZScpCnBsdC50aXRsZSgn0J7RgtGE0LjQu9GM0YLRgNC+0LLQsNC90L3Ri9C5INGB0LjQs9C90LDQuyAo0L3QuNC30LrQvtGH0LDRgdGC0L7RgtC90YvQuSDRhNC40LvRjNGC0YApJykKcGx0LnhsYWJlbCgn0JLRgNC10LzRjyBb0YFdJykKcGx0LnlsYWJlbCgn0JDQvNC/0LvQuNGC0YPQtNCwJykKcGx0LmdyaWQoKQpwbHQubGVnZW5kKCkKCnBsdC50aWdodF9sYXlvdXQoKQpwbHQuc2hvdygpCg==