Я бы предложил нелинейный подход - эффективно вы хотите сделать обнаружение огибающей с короткой постоянной времени.
y_1 = 0; // init y_1 = previous value of output signal, y
loop
y = abs(x); // rectify input signal
y = k * y + (1.0 - k) * y_1; // apply single pole recursive low pass filter
y_1 = y; // save output value for next iteration
end
Выбор k
(NB: 0.0 < k < 1.0
) является сложной частью иможет потребовать некоторых экспериментов.Если k
слишком мало, то у вас будет большая постоянная времени, и это может привести к слишком большой задержке в вашем обнаружении начала.Если k слишком велико, тогда постоянная времени может быть слишком маленькой, и вы можете получить ложные срабатывания.(В последнем случае вы можете улучшить результаты, отклонив начало, которое находится в заданном минимальном интервале времени от предыдущего «реального» начала (например, 10 мс).) Начните, скажем, с k = 0,1, а затем, возможно, попробуйтеуменьшая его, пока задержка не станет неприемлемой.