Поскольку вы отправили мне по почте другой набор данных, который сильно отличается от того, который вы опубликовали здесь, я объясню другой способ работы с вашими данными.
Для полноты вы можете найти подробную информацию о наборе данных на рисунке ниже:
![New dataset](https://i.stack.imgur.com/QMQUq.png)
Слева вы видите полный набор данных, а справа - деталь. В отличие от предыдущего набора данных, мы видим, что каждый пик не находится на постоянном уровне, и нам также не нужно интерполировать в смысле ближайшего соседа, как это было раньше.
Прежде всего, мой предыдущий ответ работает очень медленно на полном наборе данных (поэтому плохое кодирование с моей стороны), но, скорее всего, он будет работать плохо, поскольку все пики могут не проецироваться на правильное значение (например, изображение наиболее часто используемые значения - 4, 4,1 и 0 (за которыми следуют -4,05 и другие)). Это может привести к сбою моего предыдущего алгоритма.
Чтобы обойти это, довольно легко выбрать два пороговых уровня, для которых мы строим предиктор: все, что больше положительного порога, рассматривается как постоянное положительное значение, все, что меньше отрицательного порога, рассматривается как отрицательная постоянная, и все в между рассматривается как ноль.
Выбрав достойные пороги, вы можете получить довольно надежную реконструкцию:
![Reconstructed signal](https://i.stack.imgur.com/q2cMH.png)
Вы можете увидеть реконструкцию зеленым цветом, а пороги отображаются пунктирными красными линиями. Должна быть возможность автоматического выбора этих порогов в зависимости от фактических данных; но я оставляю это на ваше усмотрение (посмотрите на мой предыдущий код, чтобы понять, как вы можете справиться с этим).
Соответствующий исходный код:
thresholdNeg = -3;
idxNeg = RealData<thresholdNeg;
valueNeg = mean(RealData(idxNeg));
thresholdPos = 3;
idxPos = RealData>thresholdPos;
valuePos = mean(RealData(idxPos));
reconData = zeros(size(RealData));
reconData(idxPos) = valuePos;
reconData(idxNeg) = valueNeg;
n = numel(reconData);
plot(RealData,'b'); hold on;
plot(reconData,'-gx');
plot([1 n NaN n 1],[thresholdPos thresholdPos NaN thresholdNeg thresholdNeg], 'r--');
редактировать :
Если вы хотите сохранить какую-либо информацию, содержащуюся на высоких и низких уровнях сигнала (если вы увеличите приблизительно постоянные уровни, вы можете заметить присутствие другого сигнала), вы можете использовать технику обратного порогового значения: сохраняйте сигнал везде но поместите сигнал в 0
, где сигнал находится между порогами.