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

 
 
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

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

 


RSS Текстовая версия Сейчас: 15th June 2025 - 17:45
Рейтинг@Mail.ru


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