Если я хорошо понял из вашего описания, то у вас есть сигнал, который представляет собой комбинацию синуса плюс константа плюс некоторые случайные глюки. Скажи, как
x[n] = A*sin(f*n + phi) + B + N[n]
где N [n] - это "глюк", от которого вы хотите избавиться.
Если глюки имеют длину одной выборки, вы можете удалить их, используя медианный фильтр, который должен быть больше, чем длина глюка. По обе стороны глюка. Глюки длины 1 означают, что вам достаточно с медианой из 3 образцов длины.
y[n] = median3(x[n])
Медиана вычисляется так: возьмите выборки x, которые вы хотите отфильтровать (x [n-1], x [n], x [n + 1]), отсортируйте их, и вы получите средний результат.
Теперь, когда шумовой сигнал отсутствует, избавьтесь от постоянного сигнала. Я понимаю, что буфер имеет ограниченную и известную длину, поэтому вы можете просто вычислить среднее значение для всего буфера. Вычитай это.
Теперь у вас есть единственный синусовый сигнал. Теперь вы можете вычислить основную частоту, считая пересечения нуля. Подсчитайте количество выборок выше 0, в котором предыдущая выборка была ниже 0. Период - это общее количество выборок вашего буфера, разделенное на это, а частота - это опосите (1 / x) периода.