устранение шума / шипов - PullRequest
       1

устранение шума / шипов

0 голосов
/ 27 ноября 2011

У меня есть данные измерений с одинаковыми положительными и отрицательными значениями, которые должны быть такими:

ReqData=[0 0 -2 -2 -2 -2 -2 -2 0 0 0 -2 -2 -2 -2 0 0 2 2 2 2 2 2 0 0 2 2 2 2 2 0 0 2 2 2 2 2 0 0 2 2 2 0 0]'

Однако в данных есть некоторые помехи измерений - поэтому реальные данные выглядят так:

RealData=[0 0 -2 -2 -2 -2 -2 -2 0 0 0 -2 -2 -2 -2 0 0 2 2 2 2 -4 -1 0 0 2 2 2 2 -7 0 0 2 2 2 2 -1 0 0 2 2 2 0 0]'
  1. Как убрать конечный шум из RealData и преобразовать его в ReqData с помощью Matlab?
  2. Как найти индексы начала и окончания каждого набораположительные или отрицательные данные и разделить их с помощью Matlab?Например, ansPositive = [3,8, 12, 15]' и ansNegative = [18, 23, 26, 30, 33, 37, 40, 42]'.

Ответы [ 3 ]

1 голос
/ 28 ноября 2011

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

Для полноты вы можете найти подробную информацию о наборе данных на рисунке ниже:

New dataset

Слева вы видите полный набор данных, а справа - деталь. В отличие от предыдущего набора данных, мы видим, что каждый пик не находится на постоянном уровне, и нам также не нужно интерполировать в смысле ближайшего соседа, как это было раньше.

Прежде всего, мой предыдущий ответ работает очень медленно на полном наборе данных (поэтому плохое кодирование с моей стороны), но, скорее всего, он будет работать плохо, поскольку все пики могут не проецироваться на правильное значение (например, изображение наиболее часто используемые значения - 4, 4,1 и 0 (за которыми следуют -4,05 и другие)). Это может привести к сбою моего предыдущего алгоритма.

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

Выбрав достойные пороги, вы можете получить довольно надежную реконструкцию: Reconstructed signal

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

Соответствующий исходный код:

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, где сигнал находится между порогами.

0 голосов
/ 27 ноября 2011

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

Сначала он определит, какие амплитуды возникают чаще всего.Предполагается, что 3 наиболее часто встречающиеся амплитуды являются правильными, вы всегда можете наложить немного разные ограничения (например, проверить, имеют ли два из них одинаковое абсолютное значение и всегда включают).

Затем он находит точки выборки, в которых сигналы имеют различную амплитуду, и корректирует ее до предыдущей амплитуды сигнала.

clc; clear all; close all;

ReqData=[0 0 -2 -2 -2 -2 -2 -2 0 0 0 -2 -2 -2 -2 0 0 2 2 2 2 2 2 0 0 2 2 2 2 2 0 0 2 2 2 2 2 0 0 2 2 2 0 0]';
RealData=[0 0 -2 -2 -2 -2 -2 -2 0 0 0 -2 -2 -2 -2 0 0 2 2 2 2 -4 -1 0 0 2 2 2 2 -7 0 0 2 2 2 2 -1 0 0 2 2 2 0 0]';

ReconData = RealData;

amplitudes = unique(RealData);
histogram = hist(RealData,amplitudes);
[histogram, sorted] = sort(histogram);
amplitudes = amplitudes(sorted);

allowedValues = amplitudes(end-2:end);
%allowedValues = [-1 0 1] * 2;

spikes = find(arrayfun(@(x) (~ismember(x,allowedValues)),RealData));
for iSpike = 1:numel(spikes)
    jSpike = spikes(iSpike);
    ReconData(jSpike) = ReconData(jSpike-1);
end

plot(ReqData,'-or'); hold on;
plot(RealData,'b');
plot(ReconData,'-gx');
0 голосов
/ 27 ноября 2011

Зависит от того, насколько шумны ваши RealData, здесь это немного сбивает с толку. Например, RealData (16) отрицателен, а ReqData (16) положителен, какой выход вы хотите в этом случае?

Я бы сделал:

 RealDataPos=double(RealData'>0);
 RealDataPosBeginning=find(conv(RealDataPos,[-1 1 0],'same')>0);
 RealDataPosEnd=find(conv(RealDataPos,[0 1 -1],'same')>0);

 RealDataNeg=double(RealData'<0);
 RealDataNegBeginning=find(conv(RealDataNeg,[-1 1 0],'same')>0);
 RealDataNegEnd=find(conv(RealDataNeg,[0 1 -1],'same')>0);

PS: Прокомментируйте, если вы хотите что-то более сложное, которое учитывает тот факт, что когда-то en положительной последовательности в reaData становится отрицательным.

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