Два фильтра нижних частот с разными частотами дискретизации - PullRequest
0 голосов
/ 20 февраля 2020

Я хотел бы отфильтровать напряжение батареи (ad c значение) онлайн, когда батарея разряжается. Я собирался считывать значение батареи каждые 10 секунд, но я решил предварительно инициализировать фильтр, быстро прочитав 25 значений с интервалом 0,01 секунды. Моя первая интуиция состояла в том, что мне нужны два фильтра из-за двух разных частот дискретизации (10 с против 0,01 с). Поэтому я использовал значения инициализации для первого фильтра, а затем передал состояние первого фильтра второму:

def online_lp_two_filters(x, init_x, fs, init_fs, cutoff_freq, order):
    normal_cutoff = cutoff_freq / (0.5 * fs)
    init_normal_cutoff = cutoff_freq / (0.5 * init_fs)

    init_fltr = signal.butter(order, init_normal_cutoff, btype='low')
    fltr = signal.butter(order, normal_cutoff, btype='low')

    zi = signal.lfilter_zi(*init_fltr)
    _, state = signal.lfilter(*init_fltr, init_x, zi=zi*init_x[0])

    x_res = []
    for val in x:
        res, state = signal.lfilter(*fltr, [val], zi=state)
        x_res.append(res)

    return x_res

Однако я получил действительно странный вывод: two filter initialization

Затем я попытался использовать ту же частоту дискретизации или, скорее, тот же фильтр:

def online_lp_filter_init(x, init_x, fs, cutoff_freq, order):
    normal_cutoff = cutoff_freq / (0.5 * fs)
    fltr = signal.butter(order, normal_cutoff, btype='low')
    zi = signal.lfilter_zi(*fltr)
    _, state = signal.lfilter(*fltr, init_x, zi=zi*init_x[0])

    x_res = []
    for val in x:
        res, state = signal.lfilter(*fltr, [val], zi=state)
        x_res.append(res)

    return x_res

, и на выходе был желаемый результат: single filter initialization

Второй подход (тот же фильтр) в порядке, или мне просто повезло?

...