|
|
  |
Операция обратная к "скользящему среднему" |
|
|
|
Jan 7 2014, 21:57
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Топикстартер задал тривиальный вопрос, на который интуитивно нашел правильный ответ. Скользящее среднее - однородный фильтр Передаточную ф-цию такого фильтра можно записать как 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)
|
|
|
|
|
Jan 7 2014, 23:22
|
Местный
  
Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961

|
Верующие могут отправлять свои естественные культовые надобности в ином месте. Интуиция - хороша с девочками - согласится/несогласится. А формулы - вещь, напротив, аналитическая. В них смотреть надо. QUOTE (thermit @ Jan 8 2014, 00:57)  разностное уравнение 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 курса.
Сообщение отредактировал AndrewN - Jan 7 2014, 23:52
|
|
|
|
|
Jan 8 2014, 07:52
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата Fat Robot: Особо неверующим будет вдвойне интересно, если в канале передачи присутствует шум, или если мы попытаемся восстанавливать данные не с начала передачи. Топикстартер писал где-то про канал с шумом? Или про несначало? Зачем фантазировать? Цитата AndrewN: Ещё раз, последний. Есть, известны только y(i). _Все_ z(i) давно пропали. Начинаем по вашей "формуле" восстанавливать z(n). y(n), y(n-1) известны, а z(n-N) - нет. Все, процесс закончен, не успев начаться. Естественно, все вышеописанные нами решения верны при нулевых начальных условиях для обоих фильтров. Настоящим индейцам это очевидно. Все остальные "случайности" из разряда ваших фантазий и желания потешить чсв.
|
|
|
|
|
Jan 8 2014, 09:04
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(_pv @ Jan 6 2014, 20:17)  да, всё оказалось просто, надо посчитать производную. скользящее среднее: Y[i] = (X[i-N] + X[i-N+1] + ... +X[i+N]) / 2N или если выразить через предыдущий отсчёт: Y[i] = Y[i-1] + (X[i+N] - X[i-N-1]) / 2N ... upd: только не 2N, a 2N+1 конечно же. Откуда взялся предыдущий отсчёт? В той же формуле кол-во элементов X, если это не ошибка, = 2N+2. Может оказаться, что для обратного преобразования понадобится ширина фильтра много выше начальной. Если так, то о точном восстановлении можно будет только мечтать. Ну и если исходные числа были не в плавающей точке, то заметные потери ещё будут по дороге туда и обратно.
Сообщение отредактировал GetSmart - Jan 8 2014, 09:17
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 8 2014, 09:10
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(thermit @ Jan 8 2014, 00:57)  Вот скрипт для особо неверующих Я попробовал ваш скрипт из интереса, слегка изменил... Все работает. Но достаточно потерять хотя бы одно входное значение (то, что топикстартер принимает после фильтра, мало ли, когда начнет принимать), как все рассыпается. Что, собственно, уже говорилось. Код 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;
|
|
|
|
|
Jan 8 2014, 09:24
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата ViKo: о достаточно потерять хотя бы одно входное значение (то, что топикстартер принимает после фильтра, мало ли, когда начнет принимать), как все рассыпается. Да. Для непрерывной обработки длинной последовательности / со случайного момента / в условиях шумов этот способ конечно же не годится. Но у топикстартера про все эти частности нет ни слова. Цитата Что, собственно, уже говорилось. Доброхоты навыдумывали себе кучу условий, назадавали вопросов и принялись бодро на них отвечать. Отвечать-то надо по существу, а не захламлять топики.
|
|
|
|
|
Jan 8 2014, 09:31
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(thermit @ Jan 8 2014, 12:24)  Доброхоты навыдумывали себе кучу условий, назадавали вопросов и принялись бодро на них отвечать. Отвечать-то надо по существу, а не захламлять топики. Не согласен. Топикстартер имеет некую отфильтрованную последовательность данных, и хочет из нее получить исходные. С чего начинались исходные данные, не известно. Явно не с нуля. Включается некий прибор, выходит на рабочий режим, запускается измерение сигнала, обрабатывается, сохраняется последняя часть. Вот эта часть и передается. "Восстановлению не подлежит."  Но, так ли важно восстановить именно то, что было? Допустим, восстановится во что-то другое, но статистически подобное. Чем плохо?
|
|
|
|
|
Jan 8 2014, 09:33
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(GetSmart @ Jan 8 2014, 16:04)  Откуда взялся предыдущий отсчёт? В той же формуле кол-во элементов X, если это не ошибка, = 2N+2. Код x0, x1, x2, x3, x4, x5, x6 <-------y2-------> + - <-------y3-------> y3 = y2 - x0 + x5 а элементов в усреднении нечётное количество чтобы фазу не портить просто для красоты. всем спасибо за комментарии, прошу прощения, если не точно указал в начале что именно нужно, найденное решение при условии что начальные условия нулевые вполне удовлетворяет. есть некие измерения при которых датчик своими конечными размерами усредняет показания по своему объёму, просто хотелось понять насколько можно увеличить пространственное разрешение частично скомпенсировав завал высоких частот из-за усреднения, при этом понятно что не бесплатно, а за счёт некоторого увеличения уровня шума после коррекции.
|
|
|
|
|
Jan 8 2014, 11:58
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(ViKo @ Jan 8 2014, 12:31)  Но, так ли важно восстановить именно то, что было? Допустим, восстановится во что-то другое, но статистически подобное. Чем плохо? Отвечу сам себе. Для задачи топикстартера - плохо. Никакой дополнительной точности не даст. Наоборот, вроде как шума добавит. Цитата(rudy_b @ Jan 8 2014, 14:34)  Но и если нет стартапа, то тоже можно кое-что сделать. Как пример - если в прописи есть участок, на котором в течении N тактов значение суммы не меняется (т.е. текущее значение равно N-му) - мы точно определяем все элементы суммы и дальше можем все точно вычислять. Подать сигнал калибратора на вход фильтра на некоторое время.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|