Скользящая средняя для АЦП
Привет всем! Я работаю над проектом, в котором мне нужно вычислить скользящее среднее значение показаний АЦП. Данные, поступающие с АЦП, представляют синусоидальную волну.
Это код, который я использую, чтобы получить скользящее среднее для данного сигнала.
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 ответ
Теперь с описанием того, что происходит, я думаю, вы хотите три скользящих средних:
- Входной сигнал. Слегка усредните его, чтобы уменьшить шум.
upper_limit
Когда вы определяете локальные максимумы, вставьте их в это среднее значение.lower_limit
Когда вы определяете локальные минимумы, вставьте их в это среднее значение.
Ваша дельта будет (upper_limit-lower_limit)/8
(или 4, или что угодно). Ваши точки гистерезиса будут upper_limit - delta
а также lower_limit + delta
,
Каждый раз, когда вы переходите к "1", вставьте текущий локальный минимум в lower_limit
скользящее среднее, а затем начать поиск нового локального максимума. Когда вы переходите в "0", нажмите локальный максимум в upper_limit
скользящее среднее и начать поиск нового локального минимума.
Существует проблема, если уровень вашего сигнала сильно меняется (вы можете попасть в точку, где ваш сигнал внезапно упадет в полосу гистерезиса, и вы никогда не получите больше переходов). Вы можете решить это несколькими способами:
- Подсчитайте, сколько времени вы проводите в диапазоне гистерезиса, и сбросьте все, если вы тратите слишком много времени.
Или же
- для каждого образца в полосе гистерезиса, принести
upper_limit
а такжеlower_limit
немного ближе друг к другу. В конце концов они рухнут до такой степени, что вы снова начнете обнаруживать переходы.
Возьми это с зерном соли. Если вы делаете это для школьного проекта, он почти наверняка не будет соответствовать тому академическому методу, который ищет ваш профессор.