Расчёт среднего значения дискретного сигнала

Все что касается фильтрации
riaman
Сообщения: 4
Зарегистрирован: 05 май 2011, 09:02

Расчёт среднего значения дискретного сигнала

Сообщение riaman »

Здравствуйте.
Поставлена задача расчитывать среднее значение дискретного сигнала по 30 отсчётам. Однако, места в памяти контроллера для хранения этих 30 значений нет, а при получении каждого нового значения необходимо высчитывать среднее. Так вот было рекомендовано использовать фильтр Баттреворта для получения среднего значения.
Я не силён в фильтрах и у меня такое представление, что они предназначены для фильтрации сигнала - удаления составляющих сигнала на ненужной частоте, а вот как их применять для вычисления среднего, совсем не пойму. Как применять в данном случае этот фильтр, какого типа и какие параметры нужно задать для его расчёта, чтоб он считал среднее по 30 значениям?

Пока, когда приходит новое значение, я считаю так:
sum_x = sum_x - sum_x/30 + new_x;
sr_x = sum_x/30;
где sr_x - среднее значение, sum_x - "некая сумма последних 30 значений", new_x - новое значение.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1036
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Расчёт среднего значения дискретного сигнала

Сообщение Бахурин Сергей »

во первых вы неправильно считаете. На очередном k-ом шаге среднее значение y(k) расчитывается по формуле:

N в вашем случае равно 30, x(k) - очередной отсчет. К сожалению я погорячился когда сказал что надо запоминать 2 значения :oops: Запоминать надо все 30 значений, поэтому буфер нужен. Если на него нет памяти, то значит фильтр скользящего среднего не получится. Можно попробовать аппроксимировать фильтр скользящего среднего бих - фильтром нижних частот. Для этого надо знать следующее:
1. 30 значений вы не можете запомнить, тогда вопрос сколько можете?
2. что за входной сигнал, какая частота дискретизации и разрядность
3. Что за контроллер каково его быстродействие и разрядность.

Бих фильтры требуют операции умножения, к тому же они могут стать неустойчивыми при округлении к-тов фильтра (например при переводе их в целочисленный вид). Можете ли вы в своем контроллере быстро умножать?

riaman
Сообщения: 4
Зарегистрирован: 05 май 2011, 09:02

Re: Расчёт среднего значения дискретного сигнала

Сообщение riaman »

Я считал почти как вы, только вместо отсчёта x(k-N) брал у(k-1) - типа отнимал вместо x(k-N) среднее полученное на предыдущем шаге. В результате, мне не надо было хранить все отсчёты.

Ответы на вопросы:
1. В принципе в рамках процедуры расчета среднего (в памяти стека) я имею достаточное кол-во памяти. В рамках же общей оперативной памяти могу запомнить где-то значений 5... Дело в том, что очередное значение приходит и запоминается в глобальной переменной, затем вызывается процедура вычисления среднего, параметрами которой должны быть новое значение, ну и ещё несколько предыдущих (сумма, среднее или ещё что-то).
2. Входной сигнал - давление в газопроводе. Мерится раз в 2 секунды. Ко мне приходят значения с датчика давления типа float.
3. Контролер семейства MSP430, достаточно быстрый и имеет разрядность 32 бита. В общем тысячу операций деления он выполняет менее чем за секунду. (если не ошибаюсь). В общем вопрос быстродействия и пока не стоит.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1036
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Расчёт среднего значения дискретного сигнала

Сообщение Бахурин Сергей »

если вы можете сделать буфер FIFO на 30 входных отсчетов, который будет сдвигаться с каждым новым отсчетом -делайте. При поступлении каждого нового отсчета вы его сдвигаете и помещаете в начало очередной отсчет x(k) потом за 2 секунды думаю вы успеете пересчитать среднее. Куда вы поместите результат это уже тонкости.

Применение фильтра баттерворта в вашем случае тоже возможно, но также потребуется буфер (не на 30 отсчетов, поменьше, но все равно потребуется) плюс куча умножений и сложений каждый раз при пересчете среднего.

riaman
Сообщения: 4
Зарегистрирован: 05 май 2011, 09:02

Re: Расчёт среднего значения дискретного сигнала

Сообщение riaman »

Бахурин Сергей писал(а):если вы можете сделать буфер FIFO на 30 входных отсчетов, который будет сдвигаться с каждым новым отсчетом -делайте. При поступлении каждого нового отсчета вы его сдвигаете и помещаете в начало очередной отсчет x(k) потом за 2 секунды думаю вы успеете пересчитать среднее. Куда вы поместите результат это уже тонкости.
Дело в том, что я не могу хранить этот буфер даже 2 секунды. Такой буфер я могу выделить только в рамках процедуры (локальных переменных).
Схема работы программы должна быть такая:
1) получил новое значение, сохранить в глобальной переменной
2) перешел в процедуру расчёта среднего (здесь можно использовать временную память стека для вызова процедуры, её достаточно, (локальные переменный, которые будут существовать только на время работы этой процедуры)). Рассчитал среднее, сохранил это значение в глобальную переменную.
3) ждем нового значения и выполняем др. задачи...

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1036
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Расчёт среднего значения дискретного сигнала

Сообщение Бахурин Сергей »

понятно переходим к плану Б. Выделяем такой буфер FIFO какой сможем. Расчитываем ФНЧ баттервотра порядка равного длине буфера минус один, при поступлении каждого нового отсчета фильтруем. Частоту среза ФНЧ делаем минимальной чтобы выделять только медленно меняющуюся составляющие. Кстати можно и фильтр Чебышева и эллиптический фильтр использовать разницы не будет, отличие будет только в к-тах

PS выделение постоянной это тоже фильтрация, поскольку мы удаляем из сигнала все кроме частоты равной 0

riaman
Сообщения: 4
Зарегистрирован: 05 май 2011, 09:02

Re: Расчёт среднего значения дискретного сигнала

Сообщение riaman »

Спасибо за ответы. Пока поизучаю литературу и потом, наверное, у меня появиться ещё куча вопросов, т.к. с фильтрами опыта работы не имею и вообще, в их теории совсем слабоват.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1036
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Расчёт среднего значения дискретного сигнала

Сообщение Бахурин Сергей »

возьмите мою программудля расчета к-тов фильтра. Кроме того почитайте этот раздел. В частности вот эту статью.

Pavia
Сообщения: 38
Зарегистрирован: 25 апр 2011, 18:45

Re: Расчёт среднего значения дискретного сигнала

Сообщение Pavia »

Чтобы получить точный фильтр надо запоминать все 30 коэффициентов.
Приближенно можно сделать так считаем сумму 30 её запоминаем S.
Выводим 1 результат O=S/30.
Затем в цикл
Потом вычисляем S как S=S-S/30;
Прибавлением I- входной отсчёт S=S+I;
Выводим 2 результат O=S/30.
и так далее.

Запомнить придется только S.

Модель можно уточнить используя используя линейное предсказание возможно идеи кодеков CELP,MELP помогут.
Тут ещё несколько коэффициентов понадобится.

Dmitri Seva
Сообщения: 30
Зарегистрирован: 07 дек 2010, 09:29

Re: Расчёт среднего значения дискретного сигнала

Сообщение Dmitri Seva »

В принципе в рамках процедуры расчета среднего (в памяти стека) я имею достаточное кол-во памяти. В рамках же общей оперативной памяти могу запомнить где-то значений 5...
Честно говоря с контроллерами дело не имел, но сам факт того что памяти хватает для стека (а это RAM память) и не хватает для глобальных переменных (что тоже по идее RAM память) вызывает сомнение. Если конечно верхнюю границу у стека целенаправленно не выставили слишком маленьким адресом.

Ответить