Я не тестировал ваш код, но мне кажется, что он должен работать нормально. Лично я бы так не реализовал функцию. Вместо этого я бы удалил D C часть сигнала до , пытаясь вычислить значение RMS. Часть D C можно оценить, посылая необработанный сигнал через фильтр нижних частот. В псевдокоде это будет
rms = sqrt(low_pass(square(x - low_pass(x))))
, тогда как то, что вы написали, в основном
rms = sqrt(low_pass(square(x)) - square(low_pass(x)))
Это не должно иметь большого значения. Однако первая формула избавляет вас от умножения. Кроме того, удаляя компонент D C перед вычислением квадрата, вы в конечном итоге умножаете меньшие числа, что может помочь в распределении битов для реализации с фиксированной точкой.
В любом случае я рекомендую вам протестировать фильтровать на вашем компьютере данные Syntheti c перед их передачей в MCU.
Как число SAMPLES (размер окна?) соотносится с F (50 Гц) и моей скоростью захвата ADC (выборок в секунду) )?
Константа SAMPLES
управляет частотой среза фильтров низких частот. Эта отсечка должна быть достаточно маленькой, чтобы почти полностью удалить часть сигнала 50 Гц. С другой стороны, если сетевое питание не полностью стабильно, измеряемое количество будет медленно меняться со временем, и вы можете захотеть, чтобы ваше пороговое значение было достаточно высоким, чтобы учесть эти изменения.
Передача Функция этих однополюсных фильтров нижних частот:
H(z) = z / (SAMPLES * z + 1 − SAMPLES)
, где
- z = exp (i 2 π f / f₀),
- i - мнимая единица,
- f - частота сигнала, а
- f₀ - частота дискретизации
Если f₀ ≫ f (что желательно для хорошей выборки), это можно аппроксимировать с помощью аналогового фильтра:
H(s) = 1/(1 + SAMPLES * s / f₀)
, где s = i2πf, а частота среза равна f₀ / (2π * SAMPLES). Тогда усиление при f = 50 Гц будет
1/sqrt(1 + (2π * SAMPLES * f/f₀)²)
Соответствующий параметр здесь (SAMPLES * f / f₀), который представляет собой количество периодов сигнала 50 Гц, которые помещаются в ваше окно выборки. Если вы подходите к одному периоду, вы пропускаете около 15% сигнала через фильтр. В два раза меньше, если вы поместите два периода, и т. Д. c.
Вы можете получить идеальное отклонение сигнала 50 Гц, если спроектируете фильтр с вырезом на этой конкретной частоте. Если вы не хотите углубляться в теорию проектирования цифровых фильтров, простейшим из таких фильтров может быть простое скользящее среднее, которое усредняет за период ровно 20 мс. Однако это имеет нетривиальные затраты в ОЗУ, поскольку вы должны хранить полные 20-миллисекундные образцы в кольцевом буфере.