Скользящая средняя для АЦП

Привет всем! Я работаю над проектом, в котором мне нужно вычислить скользящее среднее значение показаний АЦП. Данные, поступающие с АЦП, представляют синусоидальную волну.

Это код, который я использую, чтобы получить скользящее среднее для данного сигнала.

longNew = (8 bit data from ADC);
longNew = longNew << 8;
//Division
longNew = longNew >> 8;    //255 Samples
longTemp = avgALong >> 8;

avgALong -= longTemp;// Old data 
avgALong += longNew;// New Data

avgA = avgALong >> 8;//256 Point Average

введите описание изображения здесь

Эталонное изображение

Эталонное изображение

Пожалуйста, обратитесь к этому изображению для верхнего и нижнего предела относительно ссылки (или AVGA)

В настоящее время я использую постоянное значение для получения верхнего предела и нижнего предела напряжения для моего приложения, которое я рассчитываю следующим образом

upper_limit = avgA + Delta(x); нижний предел = avgA - дельта (х);

В моем случае я беру Delta(x) = 15.

Я хочу рассчитать это постоянное выражение или дельта (х) на основе уровня сигнала. Максимальный уровень напряжения сигнала составляет 255 или 5 Вольт. Минимальный уровень напряжения сигнала часто меняется, потому что постоянное значение бесполезно для моего приложения, которое определяет нижний и верхний предел.

Пожалуйста помоги

Спасибо

1 ответ

Решение

Теперь с описанием того, что происходит, я думаю, вы хотите три скользящих средних:

  1. Входной сигнал. Слегка усредните его, чтобы уменьшить шум.
  2. upper_limit Когда вы определяете локальные максимумы, вставьте их в это среднее значение.
  3. lower_limit Когда вы определяете локальные минимумы, вставьте их в это среднее значение.

Ваша дельта будет (upper_limit-lower_limit)/8 (или 4, или что угодно). Ваши точки гистерезиса будут upper_limit - delta а также lower_limit + delta,

Каждый раз, когда вы переходите к "1", вставьте текущий локальный минимум в lower_limit скользящее среднее, а затем начать поиск нового локального максимума. Когда вы переходите в "0", нажмите локальный максимум в upper_limit скользящее среднее и начать поиск нового локального минимума.

Существует проблема, если уровень вашего сигнала сильно меняется (вы можете попасть в точку, где ваш сигнал внезапно упадет в полосу гистерезиса, и вы никогда не получите больше переходов). Вы можете решить это несколькими способами:

  1. Подсчитайте, сколько времени вы проводите в диапазоне гистерезиса, и сбросьте все, если вы тратите слишком много времени.

Или же

  1. для каждого образца в полосе гистерезиса, принести upper_limit а также lower_limit немного ближе друг к другу. В конце концов они рухнут до такой степени, что вы снова начнете обнаруживать переходы.

Возьми это с зерном соли. Если вы делаете это для школьного проекта, он почти наверняка не будет соответствовать тому академическому методу, который ищет ваш профессор.

Другие вопросы по тегам