Jump to content
    

Операция обратная к "скользящему среднему"

Посмотрите, где лежат полюсы вашего "обратного фильтра".

 

Пропустите полученный сигнал через обратный фильтр (3*z^3)/(z^2+z+1) и будет исходный сигнал.

 

Share this post


Link to post
Share on other sites

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

 

Скользящее среднее - однородный фильтр

Передаточную ф-цию такого фильтра можно записать как

 

 

 

H(z) = 1/N*(1-z^-N)/(1-Z^-1)

 

разностное уравнение y(n)=( x(n) - x(n-N) )/N + y(n-1)

 

Восстанавливающий фильтр будет с пф 1/H(z) = N*(1-z^-1)/(1-z^-N)

 

разностное уравнение z(n)=( y(n) - y(n-1) )*N + z(n-N) что и получил топикстартер.

 

При чем тут определенные интегралы и др дивергенции роторов - совершенно непонятно...

 

Вот скрипт для особо неверующих

clear all;
N=100;

b1=[1 zeros(1,N-1) -1];
a1=[1 -1];


x=randn(1,10000);

y=filter(b1,a1,x)/N;


z=filter(a1,b1,y)*N;

plot(x-z)

Share this post


Link to post
Share on other sites

Верующие могут отправлять свои естественные культовые надобности в ином месте. Интуиция - хороша с девочками - согласится/несогласится. А формулы - вещь, напротив, аналитическая. В них смотреть надо.

разностное уравнение z(n)=( y(n) - y(n-1) )*N + z(n-N) что и получил топикстартер.
А тут - вроде смотрим, а видим...

 

Ещё раз, последний. Есть, известны только y(i). _Все_ z(i) давно пропали. Начинаем по вашей "формуле" восстанавливать z(n). y(n), y(n-1) известны, а z(n-N) - нет. Все, процесс закончен, не успев начаться.

 

Поясняю, при чём тут интеграл. Формула скользящего среднего z = (y(1) + ... + y(n))/n - это вычисление определённого интеграла аппроксимацией прямоугольниками, т.е. нулевого порядка.

 

Учите численные методы для 1 курса.

Edited by AndrewN

Share this post


Link to post
Share on other sites

Особо неверующим будет вдвойне интересно, если в канале передачи присутствует шум, или если мы попытаемся восстанавливать данные не с начала передачи.

 

Вот скрипт для особо неверующих

 

Share this post


Link to post
Share on other sites

Fat Robot:

Особо неверующим будет вдвойне интересно, если в канале передачи присутствует шум, или если мы попытаемся восстанавливать данные не с начала передачи.

 

 

Топикстартер писал где-то про канал с шумом? Или про несначало? Зачем фантазировать?

 

AndrewN:

Ещё раз, последний. Есть, известны только y(i). _Все_ z(i) давно пропали. Начинаем по вашей "формуле" восстанавливать z(n). y(n), y(n-1) известны, а z(n-N) - нет. Все, процесс закончен, не успев начаться.

 

Естественно, все вышеописанные нами решения верны при нулевых начальных условиях для обоих фильтров. Настоящим индейцам это очевидно. Все остальные "случайности" из разряда ваших фантазий и желания потешить чсв.

Share this post


Link to post
Share on other sites

да, всё оказалось просто, надо посчитать производную.

скользящее среднее:

Y = (X[i-N] + X[i-N+1] + ... +X[i+N]) / 2N

или если выразить через предыдущий отсчёт:

Y = Y[i-1] + (X[i+N] - X[i-N-1]) / 2N

...

upd: только не 2N, a 2N+1 конечно же.

Откуда взялся предыдущий отсчёт?

В той же формуле кол-во элементов X, если это не ошибка, = 2N+2.

 

Может оказаться, что для обратного преобразования понадобится ширина фильтра много выше начальной. Если так, то о точном восстановлении можно будет только мечтать. Ну и если исходные числа были не в плавающей точке, то заметные потери ещё будут по дороге туда и обратно.

Edited by GetSmart

Share this post


Link to post
Share on other sites

Вот скрипт для особо неверующих

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

clear all;
N = 100;
b = [1 1 1 1];
a = [4 0];

x = randn(N, 1);
y = filter(b, a, x);
y(50) = 0;           % потеряли выборку 
z = filter(a, b, y);

clf;
hold on;
plot(x, 'b');
% plot(y, 'm');
plot(z, 'r');
% plot(x - z, 'k');
hold off;

Share this post


Link to post
Share on other sites

ViKo:

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

 

Да. Для непрерывной обработки длинной последовательности / со случайного момента / в условиях шумов этот способ конечно же не годится. Но у топикстартера про все эти частности нет ни слова.

 

Что, собственно, уже говорилось.

 

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

Отвечать-то надо по существу, а не захламлять топики.

Share this post


Link to post
Share on other sites

По существу же сказано, если имеются только данные с выхода фильтра, то для вселенского счастья не хватит одного неотфильтрованного элемента :)

Share this post


Link to post
Share on other sites

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

Отвечать-то надо по существу, а не захламлять топики.

Не согласен. Топикстартер имеет некую отфильтрованную последовательность данных, и хочет из нее получить исходные. С чего начинались исходные данные, не известно. Явно не с нуля. Включается некий прибор, выходит на рабочий режим, запускается измерение сигнала, обрабатывается, сохраняется последняя часть. Вот эта часть и передается. "Восстановлению не подлежит." :laughing:

 

Но, так ли важно восстановить именно то, что было? Допустим, восстановится во что-то другое, но статистически подобное. Чем плохо?

Share this post


Link to post
Share on other sites

Откуда взялся предыдущий отсчёт?

В той же формуле кол-во элементов X, если это не ошибка, = 2N+2.

x0, x1, x2, x3, x4, x5, x6
<-------y2------->  +
-   <-------y3------->  
y3 = y2 - x0 + x5

а элементов в усреднении нечётное количество чтобы фазу не портить просто для красоты.

 

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

есть некие измерения при которых датчик своими конечными размерами усредняет показания по своему объёму, просто хотелось понять насколько можно увеличить пространственное разрешение частично скомпенсировав завал высоких частот из-за усреднения, при этом понятно что не бесплатно, а за счёт некоторого увеличения уровня шума после коррекции.

Share this post


Link to post
Share on other sites

С рекурсивным алгоритмом в принципе "нечестно". Исследовать точность/достоверность (приближения) необходимо без рекурсии. В общем случае стартовый неотфильтрованный элемент неизвестен. А проход всей последовательности рекурсивным фильтром автоматом расширяет ширину фильтра до всей длины последовательности.

 

Рекурсия теоретически может вызвать резонанс с амплитудой много выше исходных данных. На этом самом месте "наследуемый" элемент фильтра ограничится переменной и фильтр собьётся, возможно до совершенной непохожести на исходник.

Edited by GetSmart

Share this post


Link to post
Share on other sites

Задачка, неожиданно, оказалась интересной.

Смотрите, изменение суммы равно разности текущего значения и значения N тактов назад. Если известны все компоненты суммы хотя бы в один момент времени, то дальше все последующие значения вычисляются точно.

 

При нулевых начальных условиях и наличии прописи старта фильтра - все вычисляется. Но и если нет стартапа, то тоже можно кое-что сделать. Как пример - если в прописи есть участок, на котором в течении N тактов значение суммы не меняется (т.е. текущее значение равно N-му) - мы точно определяем все элементы суммы и дальше можем все точно вычислять.

Share this post


Link to post
Share on other sites

Но, так ли важно восстановить именно то, что было? Допустим, восстановится во что-то другое, но статистически подобное. Чем плохо?

Отвечу сам себе. Для задачи топикстартера - плохо. Никакой дополнительной точности не даст. Наоборот, вроде как шума добавит.

 

Но и если нет стартапа, то тоже можно кое-что сделать. Как пример - если в прописи есть участок, на котором в течении N тактов значение суммы не меняется (т.е. текущее значение равно N-му) - мы точно определяем все элементы суммы и дальше можем все точно вычислять.

Подать сигнал калибратора на вход фильтра на некоторое время.

Share this post


Link to post
Share on other sites

Как пример - если в прописи есть участок, на котором в течении N тактов значение суммы не меняется (т.е. текущее значение равно N-му) - мы точно определяем все элементы суммы и дальше можем все точно вычислять.

Из чего это следует?

Если на выходе N элементов подряд имеют одинаковое значение, то они являются функцией N+N-1 входных элементов.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...