реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Плавающее среднее., поиск коэффициентов.
_sv_
сообщение Sep 6 2013, 14:11
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 6-03-11
Пользователь №: 63 436



Добрый день всем.
Реализую простейший фильтр "скользящее среднее".
output = input + FILTER_CONST * (output – input);

Требуется адаптивно выбирать FILTER_CONST в процессе работы.
Не могу найти способ вычисления оной.

Мне, собственно, задают допустимое время накопления и порог.
Надо как-то вычислить FILTER_CONST.

Спасибо.


Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 6 2013, 14:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



это не скользящее среднее, это БИХ фильтр НЧ первого порядка, с 20дБ/дек начиная с частоты среза (-3дБ) которая равна Fs*FILTER_CONST (Fs - частота дискретизации).
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 6 2013, 15:12
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



http://en.wikipedia.org/wiki/Low-pass_filter


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Corner
сообщение Sep 6 2013, 18:21
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Практически цифровая RC-цепочка...

Цитата(_pv @ Sep 6 2013, 18:24) *
это не скользящее среднее, это БИХ фильтр НЧ первого порядка, с 20дБ/дек начиная с частоты среза (-3дБ) которая равна Fs*FILTER_CONST (Fs - частота дискретизации).

Проще говоря если FILTER_CONST >0,5 схема превращается в генератор...
Go to the top of the page
 
+Quote Post
andyp
сообщение Sep 6 2013, 18:44
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Вам бы надо

output(t) = alpha*input + (1-alpha)*output(t-1) , 0 < alpha < 1.

Если надо скользящее среднее на N отсчетов, то alpha~=2/(N+1) - последнее по wiki написано и наверное стоит это проверить в чем-либо типа матлаба, сравнив АЧХ получившегося фильтра и фильтра скользящего среднего c ИХ вида 1/N*ones(1,N).

Ваша FILTER_CONST = 1- alpha

Сообщение отредактировал andyp - Sep 6 2013, 18:49
Go to the top of the page
 
+Quote Post
thermit
сообщение Sep 6 2013, 20:09
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730




Топикстартер, если хочешь внятных ответов, задавай вопрос внятно. Твой фильтр будет делать все. тока не усреднять.

y(n)=y(n-1)+(x(n)-y(n-1))*k
это распространенный фнч бих 1-го порядка для всяких усреднений.

k=1 - (1-L)^(1/T/sf)
L-уровень
sf-частота дискретизации
T-время достижения уровня



Сообщение отредактировал thermit - Sep 7 2013, 05:19
Go to the top of the page
 
+Quote Post
_sv_
сообщение Sep 7 2013, 07:51
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 6-03-11
Пользователь №: 63 436



Сразу - извиняюсь за долгое молчание.
Был в отъезде. Спасибо всем за быстрые ответы.

Теперь по делу: В первом посте досадная опечатка:
Следует читать "output = input + FILTER_CONST * (input - output)"
И это не "мой фильтр". В смысле, что я его не выдумывал.
Это первое попавшееся мне решение задачи "усреднение за время".
Мне всего-то надо усреднять данные от датчика света за некие интервалы времени.

Цитата(thermit @ Sep 6 2013, 22:09) *
y(n)=y(n-1)+(x(n)-y(n-1))*k
Да. Именно это и было реализовано (после устранения ошибки).

Цитата(thermit @ Sep 6 2013, 22:09) *
k=1 - (1-L)^(1/T/sf)
Вот. Именно эту формулу и не мог найти. Спасибо.


Цитата(andyp @ Sep 6 2013, 20:44) *
Вам бы надо
output(t) = alpha*input + (1-alpha)*output(t-1) , 0 < alpha < 1.
Тоже интересно. Насколько я понимаю, то это практически то же самое, что и у "thermit".
Надо бы разобраться как в этом случае считается коэффициент alpha.

Сижу с матлабом. Экспериментирую.

Еще раз - спасибо всем.
Мне кажется, что будут еще вопросы.
Go to the top of the page
 
+Quote Post
thermit
сообщение Sep 7 2013, 08:40
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



[quote name='_sv_' date='Sep 7 2013, 10:51' post='1190907']


Тоже интересно. Насколько я понимаю, то это практически то же самое, что и у "thermit".
[/qoute]

да. это то же самое. альфа=k






Go to the top of the page
 
+Quote Post
andyp
сообщение Sep 7 2013, 08:42
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(_sv_ @ Sep 7 2013, 11:51) *
Следует читать "output = input + FILTER_CONST * (input - output)"


Да все у Вас нормально было:

out(k) = in(k) + FILTER_CONST*(out(k-1) - in(k));

после перегруппировки слагаемых получаем

out(k) = (1 - FILTER_CONST) in(k) + FILTER_CONST*out(k-1)

если FILTER_CONST = 1 - alpha, то это та форма, что приведена в wiki. Таким образом, имеем два ФНЧ один - КИХ (скользящее среднее на N отсчетов) с АЧХ вида sin(Nx)/sin(x), второй - БИХ с АЧХ вида abs(alpha*exp(j*omega)/(exp(j*omega) + (1 - alpha))). Последнее выражение можно упростить, но мне сейчас лень. Чтобы оба фильтра интегрировали одинаково по крайней мере белый шум, нужно, чтобы были равны их шумовые полосы в полосе интегрируемого сигнала. Шумовая полоса - это интеграл АЧХ, нормированный на максимальный коэффициент передачи фильтра в некотором диапазоне частот. Отсюда и получается связь между alpha и N.
Go to the top of the page
 
+Quote Post
_sv_
сообщение Sep 7 2013, 10:44
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 6-03-11
Пользователь №: 63 436



При более детальном изучении оказалось, что:
1) существуют два подхода к вопросу:
output = input + FILTER_CONST * (output – input);
output = input + FILTER_CONST * (input - output);
При этом и тот и другой реализуют разные вещи.
(input - output) - фильтр
(output – input) - какой-то там интегратор.

В связи с чем:
Цитата(thermit @ Sep 6 2013, 22:09) *
Твой фильтр будет делать все. тока не усреднять.
Ваше утверждение поставлено под сомнение.
Изучаю предмет дальше.
Действительно - пока что полученные результаты ну никак не "плавающее среднее".




Go to the top of the page
 
+Quote Post
thermit
сообщение Sep 7 2013, 15:36
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



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

2 к вопросу усреднения в контексте вашей задачи существует ровно 1 подход: выборочное среднее (скользящее среднее). Все остальные подходы - более общая нч-фильтрация со своими заморочками.


3 если вы думаете заменить однородный ких (скользящее среднее по N отсчетам) эквивалентным бих-ом 1-го порядка то это врядли. так что не тратьте зря время. ибо

4 строгий эквивалентный бих выглядит так:
y(n)=x(n)/N-x(n-N)/N+y(n-1)

5 изучать эти вопросы по википедии не надо.
Go to the top of the page
 
+Quote Post
_sv_
сообщение Sep 7 2013, 19:06
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 6-03-11
Пользователь №: 63 436



Цитата(thermit @ Sep 7 2013, 17:36) *
если вы думаете заменить однородный ких ... эквивалентным бих-ом 1-го порядка то это врядли.
Вы знаете... Я несколько раз прочитал свои посты.
Не могу найти кто и откуда взял, что меня интересуют БИХ фильтры, или какие-то там замены.
Гляньте, пожалуйста и Вы.

Все, что меня действительно интересует это "скользящее среднее".
У меня все более или менее получается, кроме достаточно точного вычисления коэффициентов.
Мне хочется, что бы пользователь задал задержку в диапазоне, скажем, от 5 до 3600 секунд.
И что бы после этого фильтр на идеальных данных (в Excel или Matlab) давал ошибку в, скажем, 5%.
Пока что в диапазоне 270...420 секунд у меня ошибка почти 30%.
В других интервалах все хорошо.

Цитата(andyp @ Sep 7 2013, 10:42) *
... получаем ...
out(k) = (1 - FILTER_CONST) in(k) + FILTER_CONST*out(k-1)
Да. Действительно получаем. Уже добрался до этого.

Цитата(andyp @ Sep 7 2013, 10:42) *
Отсюда и получается связь между alpha и N.
Ваши посты продвигают меня по дебрям DSP.
Совершенно новая для меня тема.

Я получаю данные от датчика раз в секунду.
Диапазон значений - от 0 до 32767.
Мне надо достаточно надежно отличить состояния "день", "ночь", "искусственное освещение".
Уровни для каждого состояния будут определены чуток позже.
Когда появится возможность установить оборудование в реальный корпус.
Задача настолько тривиальна, что мне по простоте душевной, казалось, что ответ я получу в течении 10 минут.
Go to the top of the page
 
+Quote Post
thermit
сообщение Sep 7 2013, 19:48
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



вообще-то вы привели уравнение бих фильтра в 1 посте топика, обозвали его скользящим средним, что не соответствует действительности...

вопщем мне нечего вам больше сказать.

Go to the top of the page
 
+Quote Post
_sv_
сообщение Sep 7 2013, 21:06
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 6-03-11
Пользователь №: 63 436



Цитата(thermit @ Sep 7 2013, 21:48) *
вообще-то вы привели уравнение бих фильтра в 1 посте топика, обозвали его скользящим средним, что не соответствует действительности...
Я, безусловно, не специалист в DSP. И в постах и в терминах наверняка есть ошибки.
Однако, название "Скользящее Среднее" было взято из:
wiki_exponential_moving_average
Мне казалось (да и сейчас кажется), что название соответствует действительности.

Цитата(thermit @ Sep 7 2013, 21:48) *
вопщем мне нечего вам больше сказать.
В общем и на том спасибо.

Разбирательство с выкладками andyp привело меня на DSPLIB
Где я, похоже, нашел ответ на мои вопросы.
Проверяю в матлабе.
Спасибо ему за это.

Сообщение отредактировал _sv_ - Sep 7 2013, 21:08
Go to the top of the page
 
+Quote Post
andyp
сообщение Sep 7 2013, 21:32
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



вот небольшой скрипт для матлаб - октав иллюстрирующий выравнивание шумовых полос для значения alpha = 2/M (т.е. фильтр скользящего среднего на М отсчетов и экспоненциальный ФНЧ при этом значении alpha имеют примерно равные шумовые полосы.) Все становится не очень хорошо при малом M = 5 (ошибка до 20%), но уже для М = 36 она не превышает одного процента. Для малых M можно еще пошаманить с подбором alpha.

Код
Ms = [5, 36, 360, 3600];  %количество отсчетов, участвующее в усреднении
show_plot = 1;
for  ii = 1 : length(Ms)
    M = Ms(ii);
    freq_ananlysis_len = 4096;
    f = linspace(0,freq_ananlysis_len-1,freq_ananlysis_len) * pi/(freq_ananlysis_len-1) * min(1, 20/M);
    s1 = abs(freqz(1/M*ones(1,M),1,f));
    alpha = 2/(M);
    s2 =  abs(freqz(alpha,[1 , -(1 -alpha)],f));
    ss(ii) = sum(s1.^2)/sum(s2.^2);
    aa = ss(ii)
    if show_plot
        mm = 10*log10(s1);
        ix = find(mm < -30); mm(ix) = -30;    
        plot(mm,'r');
        hold on;
        mm = 10*log10(s2);
        ix = find(mm < -30); mm(ix) = -30;    
        plot(mm,'g');
        hold off
        grid on
        pause(5)
    end
end

err = abs(ss - 1)
Go to the top of the page
 
+Quote Post
_sv_
сообщение Sep 7 2013, 22:13
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 6-03-11
Пользователь №: 63 436



Цитата(andyp @ Sep 7 2013, 23:32) *
вот небольшой скрипт для матлаб...
Все ... не очень хорошо при малом M = 5 (ошибка до 20%), но уже для М = 36 она не превышает одного процента.
У меня результаты сильно отличаются от Ваших.
Почему - буду разбираться дальше.
Правда, ошибки у меня уже в пределах, для меня допустимых.
Продолжу завтра.

Спасибо.
Go to the top of the page
 
+Quote Post
Corner
сообщение Sep 9 2013, 06:40
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Использую функцию выход=(выход+вход)/2. Если ее каскадировать, то получается хороший сплайн для прямоугольных сигналов.
Правильный эквивалент все-таки: выход=выход+(вход-выход)/2.
Или в записи _sv_: output = output + FILTER_CONST * (input - output), где FILTER_CONST <= 0,5 иначе схема - генератор. Это интегрирующая цепочка, только вот частота среза далеко не Fs*FILTER_CONST, так как при FILTER_CONST = 0,5 она равна Fs*0,113.

Сообщение отредактировал Corner - Sep 9 2013, 06:42
Go to the top of the page
 
+Quote Post
_sv_
сообщение Sep 10 2013, 08:04
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 6-03-11
Пользователь №: 63 436



Цитата(Corner @ Sep 9 2013, 08:40) *
Правильный эквивалент ... output = output + FILTER_CONST * (input - output),
Та вроде - да.

Цитата(Corner @ Sep 9 2013, 08:40) *
интегрирующая цепочка ... частота среза ... равна Fs*0,113.
И это тоже, похоже, верно.


Математические эксперименты мною пока прекращены. Обнаружились проблемы на плате.
Установлены два двух ваттных ИК светодида. Жарят так, что забивают мне датчик.
Это при том, что приняты все (как мне казалось) меры для предотвращения этого эффекта.
Фильтры, механические пергородки и т.д.

К теме вернусь чуток позже.
Go to the top of the page
 
+Quote Post
_sv_
сообщение Sep 25 2013, 15:37
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 6-03-11
Пользователь №: 63 436



Цитата(_sv_ @ Sep 10 2013, 10:04) *
К теме вернусь чуток позже.


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

Вылезла проблема перегрева платы при включенной ИК подсветке.
Грелся датчик вместе с платой. Давал медленно ползущие ввех значения.
Я считал, что ошибка в матемалике фильтра.

Спасибо всем участовавшим и отдельное andyp
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 07:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016