Я хотел бы отфильтровать напряжение батареи (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
Однако я получил действительно странный вывод:
Затем я попытался использовать ту же частоту дискретизации или, скорее, тот же фильтр:
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
, и на выходе был желаемый результат:
Второй подход (тот же фильтр) в порядке, или мне просто повезло?