趋势或过滤锯齿信号(Python)

时间:2016-02-17 13:42:18

标签: python numpy filter scipy trend

我试图通过使用滤波滤波器来消除信号的趋势(锯齿)而没有良好的结果。这里是data

core_3 = pd.read_csv(filename_3, sep=";",header=0,index_col = 0,
                     parse_dates=True, names='date','temp'], infer_datetime_format=True, dayfirst=True)

core_7 = pd.read_csv(filename_7 ,sep=";",header=0,index_col = 0,
                    parse_dates=True, names=['date','temp'], infer_datetime_format=True,dayfirst=True)

当我应用巴特沃斯滤波器时

b3, a3 = sg.butter(1, 0.045)
y3     = sg.filtfilt(b3, a3, core_3.temp)
b7, a7 = sg.butter(1, 0.030)
y7     = sg.filtfilt(b7, a7, core_7.temp)

结果是 enter image description here

正如您所看到的,3 THz信号有锯齿趋势。在21:45,信号有扰动(我想研究那个扰动)。在7太赫兹处清楚地观察到这种扰动。在3 THz时观察到锯齿的中断。所以,我需要去掉或过滤这个信号。我尝试使用filtfilt过滤器,但我不知道使用scipy.detrend是否更方便。

1 个答案:

答案 0 :(得分:2)

对于此信号,过滤和简单的去除都不会对您有任何好处。第一个问题是趋势有些周期性。第二个问题是周期性不是固定的。我相信线性方法无法解决问题。

我建议你做以下事情:

  1. 删除跳跃(“展开锯齿”)
  2. 然后使用低通滤波器或其他任何
  3. 来消除信号

    以下是一个例子:

    import numpy as np
    import scipy.signal as sps
    import matplotlib.pyplot as plt
    
    np.random.seed(123)
    
    # create an example signal
    x = []
    ofs = 3.4
    slope = 0.002
    for t in np.linspace(0, 100, 1000):
        ofs += slope    
        x.append(np.sin(t*2) * 0.1 + ofs)
        if x[-1] > 4:
            ofs =3.2
            slope = np.random.rand() * 0.003 + 0.002
    x = np.asarray(x)    
    plt.plot(x, label='original')
    
    # detect and remove jumps
    jmps = np.where(np.diff(x) < -0.5)[0]  # find large, rapid drops in amplitdue
    for j in jmps:
        x[j+1:] += x[j] - x[j+1]    
    plt.plot(x, label='unrolled')
    
    # detrend with a low-pass
    order = 200
    x -= sps.filtfilt([1] * order, [order], x)  # this is a very simple moving average filter
    plt.plot(x, label='detrended')
    
    plt.legend(loc='best')
    plt.show()
    

    enter image description here