FatRobot 6 January 7, 2014 Posted January 7, 2014 · Report post Посмотрите, где лежат полюсы вашего "обратного фильтра". Пропустите полученный сигнал через обратный фильтр (3*z^3)/(z^2+z+1) и будет исходный сигнал. Quote Share this post Link to post Share on other sites More sharing options...
thermit 5 January 7, 2014 Posted January 7, 2014 · Report post Топикстартер задал тривиальный вопрос, на который интуитивно нашел правильный ответ. Скользящее среднее - однородный фильтр Передаточную ф-цию такого фильтра можно записать как 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) Quote Share this post Link to post Share on other sites More sharing options...
andrewn 0 January 7, 2014 Posted January 7, 2014 (edited) · Report post Верующие могут отправлять свои естественные культовые надобности в ином месте. Интуиция - хороша с девочками - согласится/несогласится. А формулы - вещь, напротив, аналитическая. В них смотреть надо. разностное уравнение 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 January 7, 2014 by AndrewN Quote Share this post Link to post Share on other sites More sharing options...
FatRobot 6 January 8, 2014 Posted January 8, 2014 · Report post Особо неверующим будет вдвойне интересно, если в канале передачи присутствует шум, или если мы попытаемся восстанавливать данные не с начала передачи. Вот скрипт для особо неверующих Quote Share this post Link to post Share on other sites More sharing options...
thermit 5 January 8, 2014 Posted January 8, 2014 · Report post Fat Robot: Особо неверующим будет вдвойне интересно, если в канале передачи присутствует шум, или если мы попытаемся восстанавливать данные не с начала передачи. Топикстартер писал где-то про канал с шумом? Или про несначало? Зачем фантазировать? AndrewN: Ещё раз, последний. Есть, известны только y(i). _Все_ z(i) давно пропали. Начинаем по вашей "формуле" восстанавливать z(n). y(n), y(n-1) известны, а z(n-N) - нет. Все, процесс закончен, не успев начаться. Естественно, все вышеописанные нами решения верны при нулевых начальных условиях для обоих фильтров. Настоящим индейцам это очевидно. Все остальные "случайности" из разряда ваших фантазий и желания потешить чсв. Quote Share this post Link to post Share on other sites More sharing options...
GetSmart 0 January 8, 2014 Posted January 8, 2014 (edited) · Report post да, всё оказалось просто, надо посчитать производную. скользящее среднее: 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 January 8, 2014 by GetSmart Quote Share this post Link to post Share on other sites More sharing options...
ViKo 0 January 8, 2014 Posted January 8, 2014 · Report post Вот скрипт для особо неверующих Я попробовал ваш скрипт из интереса, слегка изменил... Все работает. Но достаточно потерять хотя бы одно входное значение (то, что топикстартер принимает после фильтра, мало ли, когда начнет принимать), как все рассыпается. Что, собственно, уже говорилось. 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; Quote Share this post Link to post Share on other sites More sharing options...
thermit 5 January 8, 2014 Posted January 8, 2014 · Report post ViKo: о достаточно потерять хотя бы одно входное значение (то, что топикстартер принимает после фильтра, мало ли, когда начнет принимать), как все рассыпается. Да. Для непрерывной обработки длинной последовательности / со случайного момента / в условиях шумов этот способ конечно же не годится. Но у топикстартера про все эти частности нет ни слова. Что, собственно, уже говорилось. Доброхоты навыдумывали себе кучу условий, назадавали вопросов и принялись бодро на них отвечать. Отвечать-то надо по существу, а не захламлять топики. Quote Share this post Link to post Share on other sites More sharing options...
GetSmart 0 January 8, 2014 Posted January 8, 2014 · Report post По существу же сказано, если имеются только данные с выхода фильтра, то для вселенского счастья не хватит одного неотфильтрованного элемента :) Quote Share this post Link to post Share on other sites More sharing options...
ViKo 0 January 8, 2014 Posted January 8, 2014 · Report post Доброхоты навыдумывали себе кучу условий, назадавали вопросов и принялись бодро на них отвечать. Отвечать-то надо по существу, а не захламлять топики. Не согласен. Топикстартер имеет некую отфильтрованную последовательность данных, и хочет из нее получить исходные. С чего начинались исходные данные, не известно. Явно не с нуля. Включается некий прибор, выходит на рабочий режим, запускается измерение сигнала, обрабатывается, сохраняется последняя часть. Вот эта часть и передается. "Восстановлению не подлежит." :laughing: Но, так ли важно восстановить именно то, что было? Допустим, восстановится во что-то другое, но статистически подобное. Чем плохо? Quote Share this post Link to post Share on other sites More sharing options...
_pv 102 January 8, 2014 Posted January 8, 2014 · Report post Откуда взялся предыдущий отсчёт? В той же формуле кол-во элементов X, если это не ошибка, = 2N+2. x0, x1, x2, x3, x4, x5, x6 <-------y2-------> + - <-------y3-------> y3 = y2 - x0 + x5 а элементов в усреднении нечётное количество чтобы фазу не портить просто для красоты. всем спасибо за комментарии, прошу прощения, если не точно указал в начале что именно нужно, найденное решение при условии что начальные условия нулевые вполне удовлетворяет. есть некие измерения при которых датчик своими конечными размерами усредняет показания по своему объёму, просто хотелось понять насколько можно увеличить пространственное разрешение частично скомпенсировав завал высоких частот из-за усреднения, при этом понятно что не бесплатно, а за счёт некоторого увеличения уровня шума после коррекции. Quote Share this post Link to post Share on other sites More sharing options...
GetSmart 0 January 8, 2014 Posted January 8, 2014 (edited) · Report post С рекурсивным алгоритмом в принципе "нечестно". Исследовать точность/достоверность (приближения) необходимо без рекурсии. В общем случае стартовый неотфильтрованный элемент неизвестен. А проход всей последовательности рекурсивным фильтром автоматом расширяет ширину фильтра до всей длины последовательности. Рекурсия теоретически может вызвать резонанс с амплитудой много выше исходных данных. На этом самом месте "наследуемый" элемент фильтра ограничится переменной и фильтр собьётся, возможно до совершенной непохожести на исходник. Edited January 8, 2014 by GetSmart Quote Share this post Link to post Share on other sites More sharing options...
rudy_b 5 January 8, 2014 Posted January 8, 2014 · Report post Задачка, неожиданно, оказалась интересной. Смотрите, изменение суммы равно разности текущего значения и значения N тактов назад. Если известны все компоненты суммы хотя бы в один момент времени, то дальше все последующие значения вычисляются точно. При нулевых начальных условиях и наличии прописи старта фильтра - все вычисляется. Но и если нет стартапа, то тоже можно кое-что сделать. Как пример - если в прописи есть участок, на котором в течении N тактов значение суммы не меняется (т.е. текущее значение равно N-му) - мы точно определяем все элементы суммы и дальше можем все точно вычислять. Quote Share this post Link to post Share on other sites More sharing options...
ViKo 0 January 8, 2014 Posted January 8, 2014 · Report post Но, так ли важно восстановить именно то, что было? Допустим, восстановится во что-то другое, но статистически подобное. Чем плохо? Отвечу сам себе. Для задачи топикстартера - плохо. Никакой дополнительной точности не даст. Наоборот, вроде как шума добавит. Но и если нет стартапа, то тоже можно кое-что сделать. Как пример - если в прописи есть участок, на котором в течении N тактов значение суммы не меняется (т.е. текущее значение равно N-му) - мы точно определяем все элементы суммы и дальше можем все точно вычислять. Подать сигнал калибратора на вход фильтра на некоторое время. Quote Share this post Link to post Share on other sites More sharing options...
GetSmart 0 January 8, 2014 Posted January 8, 2014 · Report post Как пример - если в прописи есть участок, на котором в течении N тактов значение суммы не меняется (т.е. текущее значение равно N-му) - мы точно определяем все элементы суммы и дальше можем все точно вычислять. Из чего это следует? Если на выходе N элементов подряд имеют одинаковое значение, то они являются функцией N+N-1 входных элементов. Quote Share this post Link to post Share on other sites More sharing options...