Как фильтровать / сглаживать с помощью SciPy / Numpy?

Я пытаюсь отфильтровать / сгладить сигнал, полученный от датчика давления с частотой дискретизации 50 кГц. Пример сигнала показан ниже:

Я хотел бы получить гладкий сигнал, полученный лессом в MATLAB (я не рисую одни и те же данные, значения разные).

Я рассчитал спектральную плотность мощности, используя функцию psd () matplotlib, и спектральная плотность мощности также представлена ​​ниже:

Я попытался использовать следующий код и получил отфильтрованный сигнал:

import csv
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy.signal import butter, lfilter, freqz

def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False)
    return b, a

def butter_lowpass_filter(data, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = lfilter(b, a, data)
    return y

data = np.loadtxt('data.dat', skiprows=2, delimiter=',', unpack=True).transpose()
time = data[:,0]
pressure = data[:,1]
cutoff = 2000
fs = 50000
pressure_smooth = butter_lowpass_filter(pressure, cutoff, fs)

figure_pressure_trace = plt.figure(figsize=(5.15, 5.15))
figure_pressure_trace.clf()
plot_P_vs_t = plt.subplot(111)
plot_P_vs_t.plot(time, pressure, linewidth=1.0)
plot_P_vs_t.plot(time, pressure_smooth, linewidth=1.0)
plot_P_vs_t.set_ylabel('Pressure (bar)', labelpad=6)
plot_P_vs_t.set_xlabel('Time (ms)', labelpad=6)
plt.show()
plt.close()

Я получаю вывод:

Мне нужно больше сглаживания, я пытался изменить частоту среза, но все же удовлетворительные результаты не могут быть получены. Я не могу получить такую ​​же гладкость от MATLAB. Я уверен, что это может быть сделано в Python, но как?

Вы можете найти данныеВот.

Обновить

Я применил низкое сглаживание из statsmodels, это также не дает удовлетворительных результатов.

Ответы на вопрос(2)

Ваш ответ на вопрос