Tôi đang cố gắng lọc/tín hiệu trơn tru thu được từ bộ chuyển đổi áp suất của tần số lấy mẫu 50 kHz. Một tín hiệu mẫu được hiển thị dưới đây:Làm thế nào để lọc/trơn tru với SciPy/Numpy?
Tôi muốn để có được một tín hiệu mịn thu được bằng cách hoàng thổ trong MATLAB (Tôi không âm mưu cùng một dữ liệu, giá trị này là khác nhau).
tôi tính toán mật độ phổ công suất sử dụng chức năng matplotlib của psd() và mật độ phổ công suất cũng được cung cấp dưới đây:
Tôi đã thử bằng cách sử dụng đoạn mã sau và thu được một tín hiệu được lọc:
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()
Sản lượng tôi nhận được là:
tôi cần làm mịn hơn, tôi cố gắng thay đổi tần số cắt nhưng vẫn kết quả khả quan không thể có được. Tôi không thể có được sự mượt mà như nhau bởi MATLAB. Tôi chắc chắn nó có thể được thực hiện bằng Python, nhưng làm thế nào?
Bạn có thể tìm thấy dữ liệu here.
Cập nhật
tôi áp dụng lowess mịn từ statsmodels, điều này cũng không cung cấp kết quả khả quan.
Bạn có thể muốn có một cái nhìn tại 'thực hiện lowess' của 'statsmodels': http://statsmodels.sourceforge.net/devel/generated/statsmodels.nonparametric.smoothers_lowess.lowess.html – cel
Tôi áp dụng lowess, thay đổi các giá trị phân số, nhưng nó không cung cấp các kết quả thỏa đáng. Các ô được đính kèm trong bản cập nhật bài đăng. –
oh okay, trông hoàn toàn kỳ lạ. Thành thật mà nói, tôi không có nghĩa là một chuyên gia trong xử lý tín hiệu, vì vậy tôi thậm chí không chắc chắn nếu nó có ý nghĩa để áp dụng 'loewess' ở đây. Tuy nhiên, tôi ngạc nhiên một chút rằng nó đã đi sai lầm khủng khiếp. – cel