Расчёт среднего значения дискретного сигнала
Расчёт среднего значения дискретного сигнала
Здравствуйте.
Поставлена задача расчитывать среднее значение дискретного сигнала по 30 отсчётам. Однако, места в памяти контроллера для хранения этих 30 значений нет, а при получении каждого нового значения необходимо высчитывать среднее. Так вот было рекомендовано использовать фильтр Баттреворта для получения среднего значения.
Я не силён в фильтрах и у меня такое представление, что они предназначены для фильтрации сигнала - удаления составляющих сигнала на ненужной частоте, а вот как их применять для вычисления среднего, совсем не пойму. Как применять в данном случае этот фильтр, какого типа и какие параметры нужно задать для его расчёта, чтоб он считал среднее по 30 значениям?
Пока, когда приходит новое значение, я считаю так:
sum_x = sum_x - sum_x/30 + new_x;
sr_x = sum_x/30;
где sr_x - среднее значение, sum_x - "некая сумма последних 30 значений", new_x - новое значение.
Поставлена задача расчитывать среднее значение дискретного сигнала по 30 отсчётам. Однако, места в памяти контроллера для хранения этих 30 значений нет, а при получении каждого нового значения необходимо высчитывать среднее. Так вот было рекомендовано использовать фильтр Баттреворта для получения среднего значения.
Я не силён в фильтрах и у меня такое представление, что они предназначены для фильтрации сигнала - удаления составляющих сигнала на ненужной частоте, а вот как их применять для вычисления среднего, совсем не пойму. Как применять в данном случае этот фильтр, какого типа и какие параметры нужно задать для его расчёта, чтоб он считал среднее по 30 значениям?
Пока, когда приходит новое значение, я считаю так:
sum_x = sum_x - sum_x/30 + new_x;
sr_x = sum_x/30;
где sr_x - среднее значение, sum_x - "некая сумма последних 30 значений", new_x - новое значение.
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Расчёт среднего значения дискретного сигнала
во первых вы неправильно считаете. На очередном k-ом шаге среднее значение y(k) расчитывается по формуле:
N в вашем случае равно 30, x(k) - очередной отсчет. К сожалению я погорячился когда сказал что надо запоминать 2 значения Запоминать надо все 30 значений, поэтому буфер нужен. Если на него нет памяти, то значит фильтр скользящего среднего не получится. Можно попробовать аппроксимировать фильтр скользящего среднего бих - фильтром нижних частот. Для этого надо знать следующее:
1. 30 значений вы не можете запомнить, тогда вопрос сколько можете?
2. что за входной сигнал, какая частота дискретизации и разрядность
3. Что за контроллер каково его быстродействие и разрядность.
Бих фильтры требуют операции умножения, к тому же они могут стать неустойчивыми при округлении к-тов фильтра (например при переводе их в целочисленный вид). Можете ли вы в своем контроллере быстро умножать?
N в вашем случае равно 30, x(k) - очередной отсчет. К сожалению я погорячился когда сказал что надо запоминать 2 значения Запоминать надо все 30 значений, поэтому буфер нужен. Если на него нет памяти, то значит фильтр скользящего среднего не получится. Можно попробовать аппроксимировать фильтр скользящего среднего бих - фильтром нижних частот. Для этого надо знать следующее:
1. 30 значений вы не можете запомнить, тогда вопрос сколько можете?
2. что за входной сигнал, какая частота дискретизации и разрядность
3. Что за контроллер каково его быстродействие и разрядность.
Бих фильтры требуют операции умножения, к тому же они могут стать неустойчивыми при округлении к-тов фильтра (например при переводе их в целочисленный вид). Можете ли вы в своем контроллере быстро умножать?
Re: Расчёт среднего значения дискретного сигнала
Я считал почти как вы, только вместо отсчёта x(k-N) брал у(k-1) - типа отнимал вместо x(k-N) среднее полученное на предыдущем шаге. В результате, мне не надо было хранить все отсчёты.
Ответы на вопросы:
1. В принципе в рамках процедуры расчета среднего (в памяти стека) я имею достаточное кол-во памяти. В рамках же общей оперативной памяти могу запомнить где-то значений 5... Дело в том, что очередное значение приходит и запоминается в глобальной переменной, затем вызывается процедура вычисления среднего, параметрами которой должны быть новое значение, ну и ещё несколько предыдущих (сумма, среднее или ещё что-то).
2. Входной сигнал - давление в газопроводе. Мерится раз в 2 секунды. Ко мне приходят значения с датчика давления типа float.
3. Контролер семейства MSP430, достаточно быстрый и имеет разрядность 32 бита. В общем тысячу операций деления он выполняет менее чем за секунду. (если не ошибаюсь). В общем вопрос быстродействия и пока не стоит.
Ответы на вопросы:
1. В принципе в рамках процедуры расчета среднего (в памяти стека) я имею достаточное кол-во памяти. В рамках же общей оперативной памяти могу запомнить где-то значений 5... Дело в том, что очередное значение приходит и запоминается в глобальной переменной, затем вызывается процедура вычисления среднего, параметрами которой должны быть новое значение, ну и ещё несколько предыдущих (сумма, среднее или ещё что-то).
2. Входной сигнал - давление в газопроводе. Мерится раз в 2 секунды. Ко мне приходят значения с датчика давления типа float.
3. Контролер семейства MSP430, достаточно быстрый и имеет разрядность 32 бита. В общем тысячу операций деления он выполняет менее чем за секунду. (если не ошибаюсь). В общем вопрос быстродействия и пока не стоит.
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Расчёт среднего значения дискретного сигнала
если вы можете сделать буфер FIFO на 30 входных отсчетов, который будет сдвигаться с каждым новым отсчетом -делайте. При поступлении каждого нового отсчета вы его сдвигаете и помещаете в начало очередной отсчет x(k) потом за 2 секунды думаю вы успеете пересчитать среднее. Куда вы поместите результат это уже тонкости.
Применение фильтра баттерворта в вашем случае тоже возможно, но также потребуется буфер (не на 30 отсчетов, поменьше, но все равно потребуется) плюс куча умножений и сложений каждый раз при пересчете среднего.
Применение фильтра баттерворта в вашем случае тоже возможно, но также потребуется буфер (не на 30 отсчетов, поменьше, но все равно потребуется) плюс куча умножений и сложений каждый раз при пересчете среднего.
Re: Расчёт среднего значения дискретного сигнала
Дело в том, что я не могу хранить этот буфер даже 2 секунды. Такой буфер я могу выделить только в рамках процедуры (локальных переменных).Бахурин Сергей писал(а):если вы можете сделать буфер FIFO на 30 входных отсчетов, который будет сдвигаться с каждым новым отсчетом -делайте. При поступлении каждого нового отсчета вы его сдвигаете и помещаете в начало очередной отсчет x(k) потом за 2 секунды думаю вы успеете пересчитать среднее. Куда вы поместите результат это уже тонкости.
Схема работы программы должна быть такая:
1) получил новое значение, сохранить в глобальной переменной
2) перешел в процедуру расчёта среднего (здесь можно использовать временную память стека для вызова процедуры, её достаточно, (локальные переменный, которые будут существовать только на время работы этой процедуры)). Рассчитал среднее, сохранил это значение в глобальную переменную.
3) ждем нового значения и выполняем др. задачи...
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Расчёт среднего значения дискретного сигнала
понятно переходим к плану Б. Выделяем такой буфер FIFO какой сможем. Расчитываем ФНЧ баттервотра порядка равного длине буфера минус один, при поступлении каждого нового отсчета фильтруем. Частоту среза ФНЧ делаем минимальной чтобы выделять только медленно меняющуюся составляющие. Кстати можно и фильтр Чебышева и эллиптический фильтр использовать разницы не будет, отличие будет только в к-тах
PS выделение постоянной это тоже фильтрация, поскольку мы удаляем из сигнала все кроме частоты равной 0
PS выделение постоянной это тоже фильтрация, поскольку мы удаляем из сигнала все кроме частоты равной 0
Re: Расчёт среднего значения дискретного сигнала
Спасибо за ответы. Пока поизучаю литературу и потом, наверное, у меня появиться ещё куча вопросов, т.к. с фильтрами опыта работы не имею и вообще, в их теории совсем слабоват.
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Расчёт среднего значения дискретного сигнала
возьмите мою программудля расчета к-тов фильтра. Кроме того почитайте этот раздел. В частности вот эту статью.
Re: Расчёт среднего значения дискретного сигнала
Чтобы получить точный фильтр надо запоминать все 30 коэффициентов.
Приближенно можно сделать так считаем сумму 30 её запоминаем S.
Выводим 1 результат O=S/30.
Затем в цикл
Потом вычисляем S как S=S-S/30;
Прибавлением I- входной отсчёт S=S+I;
Выводим 2 результат O=S/30.
и так далее.
Запомнить придется только S.
Модель можно уточнить используя используя линейное предсказание возможно идеи кодеков CELP,MELP помогут.
Тут ещё несколько коэффициентов понадобится.
Приближенно можно сделать так считаем сумму 30 её запоминаем S.
Выводим 1 результат O=S/30.
Затем в цикл
Потом вычисляем S как S=S-S/30;
Прибавлением I- входной отсчёт S=S+I;
Выводим 2 результат O=S/30.
и так далее.
Запомнить придется только S.
Модель можно уточнить используя используя линейное предсказание возможно идеи кодеков CELP,MELP помогут.
Тут ещё несколько коэффициентов понадобится.
-
- Сообщения: 30
- Зарегистрирован: 07 дек 2010, 09:29
Re: Расчёт среднего значения дискретного сигнала
Честно говоря с контроллерами дело не имел, но сам факт того что памяти хватает для стека (а это RAM память) и не хватает для глобальных переменных (что тоже по идее RAM память) вызывает сомнение. Если конечно верхнюю границу у стека целенаправленно не выставили слишком маленьким адресом.В принципе в рамках процедуры расчета среднего (в памяти стека) я имею достаточное кол-во памяти. В рамках же общей оперативной памяти могу запомнить где-то значений 5...