Перейти к содержанию
    

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

есть измеренные данные про которые известно, что по ним прошлись скользяшим средним с неким известным размером D.

каким образом можно восстановить исходные данные которые были до усреднения?

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

Как это делать математически правильно?

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

А если без преобразования в частотную область, с какой функцией надо сделать свёртку чтобы получить фильтр обратный скользящему среднему? или даже в общем случае, каким образом преобразовать коэффициенты КИХ фильтра, чтобы произведение исходного фильтра и пробразованного давало 1.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть измеренные данные про которые известно, что по ним прошлись скользяшим средним с неким известным размером D.

Если отвлечься от фильтров, Вы по сути проинтегрировали данные взяв в качестве области интегрирования D отсчетов. И хотите сделать обратную операцию. Обратная операция для интегрирования это взятие производной. Может тогда продифференцировать данные с тем же количеством отсчетов. Не могу сразу сказать как это сделать, но формула должна быть очень простая, исходя из базового определения производной.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для решения задачи нужно прежде всего почитать про z-преобразование.

и конечно же не спутать с z-преобразованием, которое z-score, или, которое, преобразование фишера, а можно вообще без этого преобразования на пальцах написать, что скользящее среднее - есть умножение матрицы на исходный вектор, и просто найти обратную к этой матрице. Если есть необходимые знания о теплицевости-циркулянтности - можно из этого через Фурье и то самое зет-преобразование самому вывести, а можно в лоб как нижнюю треугольную решить. Тоже кстати достаточно устойчиво и программируется в 6 строчек без сложных слов типа БПФ и комплексных чисел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и конечно же не спутать с z-преобразованием, которое z-score, или, которое, преобразование фишера, а можно вообще без этого преобразования на пальцах написать, что скользящее среднее - есть умножение матрицы на исходный вектор, и просто найти обратную к этой матрице. Если есть необходимые знания о теплицевости-циркулянтности - можно из этого через Фурье и то самое зет-преобразование самому вывести, а можно в лоб как нижнюю треугольную решить. Тоже кстати достаточно устойчиво и программируется в 6 строчек без сложных слов типа БПФ и комплексных чисел.

 

Z-преобразование это дискретное преобразование Лапласса.

Умножение матрицы на вектор? Расскажите подробнее пожалуйста. Как с использованием z-преобразования знаю, а про такой подход не слышал. Фактически скользящее среднее есть свертка. По теореме о свертке ее можно свести к умножению проделав z-преобразование или дискретное преобразование фурье (которое в данном случае совпадет с z-преобразованием). Каким боком применить к этому делу матрицу для мне неизвестно. Или вы имеете ввиду алгоритмы быстрого преобразования Фурье?

 

Мне известен только один способ восстановления последовательности, обработаной сверткой. Он называется оптимальная гомоморфная фильтрация и детально изложен в книге Рабинера и Голда по цифровой обработке сигналов. Книга старая 70-х годов.

Ключевое слово для поиска в гугле кепстр (измененное слово спектр).

http://en.wikipedia.org/wiki/Cepstrum

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

соответственно

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

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

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

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

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

соответственно

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

 

Поздравляю :) Как все просто оказалось.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Умножение матрицы на вектор? Расскажите подробнее пожалуйста.

 

Пусть $x \in R^n$ исходный вектор до обработки скользящим средним. Тогда если скользящее среднее имеет длину K, то результат его применения можно записать как умножение матрицы

(1 0 ... 0)

(1/2 1/2 0 ... 0)

(... {1/K ... 1/K}(K раз) 0 ... 0)

(...)

(0 ... 0 1/K 1/K ... 1/K)

(...)

(0... 0 1)

 

- надеюсь, понятно, без ЛаТеХа не могу красиво нарисовать.

 

Теперь внимательно смотрим, что получилось. Если отбросить первые и последние K-1 строчек - получается Теплицева матрица, если перейти к бесконечным, то в пределе по спектру она должна совпадать с соответствующим циркулянтом, спектр которого получается их БПФа оного. Как я понимаю, формулы должны с зет-преобразованием совпасть, но кропотливо не проверял.

 

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

 

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

 

Лучший метод, конечно же через Фурье, так как есть контроль спектра, но с умением дела можно и без оного обойтись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

каким образом можно восстановить исходные данные которые были до усреднения?

А какого рода данные там были? Если строго гармонические, то какие частоты сверху и снизу.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть измеренные данные про которые известно, что по ним прошлись скользяшим средним с неким известным размером D.

каким образом можно восстановить исходные данные которые были до усреднения?

Никак.

 

В общем случае исходные данные теряются навсегда. Если лень изучить теорию обратных операций (хотя интегрирование это, конечно, функционал, а не оператор), то хотя бы поразмышляйте над средним арифметическим (x+y)/2 = a. Отсюда имеем линейное уравнение x+y = 2a. а известно. Сколько решений можно получить для двух переменных из одного уравнения? Правильно.

Изменено пользователем AndrewN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Никак.

В общем случае исхожные данные теряются навсегда.

я решение выше вроде как привёл.

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

ну а после умножения на 0, дейтствительно, восстанавить обратно непросто.

post-3954-1389105644_thumb.png

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

X[i+N] = X[i-N-1] + (Y - Y[i-1]) * (2N+1)
я решение выше вроде как привёл.

Это не решение, а хотение. Вы _не_ знаете величину X[i-N-1] в общем случае. А то, что у вас в ряду данных первые отсчёты - нули, это случайность. Разность соседних средних = разности _двух_ исходных отсчётов. Опять одно уравнение для _двух_ переменных. Т.е. ваша формула на самом деле

 

X'[i+N] = ??? + (Y - Y[i-1]) * (2N+1), штрих обозначает оценку X[i+N], а модуль |???| не ограничен сверху, т.е. ошибка может быть произвольно большой.

 

Занимайтесь самообманом сколько влезет, но не морочьте голову публике (не вы один, впрочем. Выше, про матрицу - тоже вздор, про преобразования - тоже вздор).

 

Скользящее среднее - это аппроксимация определённого интеграла в непрерывном случае. Восстановить подинтегральную функцию по значению интеграла - невозможно.

Изменено пользователем AndrewN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость TSerg
..есть измеренные данные про которые известно, что по ним прошлись скользяшим средним с неким известным размером D.

..каким образом можно восстановить исходные данные которые были до усреднения?

 

В общем случае - никак.

Для приближенного восстановления требуются оговорки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот и синтезируйте фильр, обратный к вашему скользящему среднему, но у которого значения АЧХ ограничены в окрестности нулей исходного фильтра (ск. среднего).

А что делать с ФЧХ в этих областях, вы сами придумаете.

 

Методов синтеза много. Если в качестве инструмента Матлаб, то посмотрите fdesign.arbmagnphase

 

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я может что-то не понимаю, но в чем загвоздка? Взятие среднего - пропуск сигнала через фильтр (для третьего порядка) (z^2+z+1)/(3*z^3). Пропустите полученный сигнал через обратный фильтр (3*z^3)/(z^2+z+1) и будет исходный сигнал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...