在使用Butterworth滤波器时,需要注意到它会在信号开始部分(尤其是在低通滤波的情况下)产生极端异常值。这是由于Butterworth滤波器本质上是一种时域卷积滤波器,没有考虑到信号的初始条件。因此,需要在信号开始之前添加所需的初始值或进行其他处理。
代码示例:
import numpy as np import matplotlib.pyplot as plt
N = 100 x = np.linspace(0, 10, N) y = np.sin(x) + 0.2 * np.random.randn(N)
from scipy.signal import butter, filtfilt
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 = filtfilt(b, a, data) return y
fs = 40.0 cutoff = 3.0
y_f = np.insert(y, 0, np.zeros(10)) y_f = butter_lowpass_filter(y_f, cutoff, fs) y_f = y_f[10:]
plt.figure(figsize=(10, 6)) plt.plot(x, y, 'b-', label='raw signal') plt.plot(x, y_f, 'r-', label='filtered') plt.xlabel('time') plt.ylabel('amplitude') plt.title('