Удаление шипов из сигнала Matlab

У меня есть следующий сигнал, который содержит некоторые искаженные данные

Необработанный сигнал

Я пытаюсь удалить эти пики, не повреждая свой сигнал, я попробовал функцию medfilt1, но она также сгладила правильный сигнал, который не нужен. Фильтрация не может быть использована из-за перекрытия частот между полезным и нежелательным сигналом. Я также попробовал движущееся окно, которое будет сравнивать значение с медианой этого окна, и если точка намного выше, оно установит его на медиану, как показано ниже:

%moving cleaning window
y1_1= y1(1:100);%first window
 x=1;
 %cleaning loop
while  x<= length(y1)
    if(y1(x)> 1.01*(median(y1_1))||y1(x) < 0.95*(median(y1_1)))
        y1(x)= median(y1_1);
    end
    if(x>= length(y1)-100)
        y1_1= y1(length(y1)-100:length(y1));
    else
     y1_1 = y1(x:x+100);
    end
     x=x+1;
end

Я избавился от пиков, но также исчезли некоторые отчетливые пики сигнала, как показано на рисунке ниже.

Вывод фактической программы

Как простым способом добиться наилучшего шумоподавления?

Спасибо


person Isra    schedule 22.03.2017    source источник
comment
Вы пробовали: stackoverflow.com/questions/27432883/finding-peaks -матлаб/   -  person Mendi Barel    schedule 22.03.2017
comment
В этом конкретном случае и только если это в целях презентации, похоже, что вы можете просто удалить (или установить NaN) все значения ниже 350 и выше 550.   -  person Dev-iL    schedule 22.03.2017
comment
Ваш код в целом выглядит нормально, хотя я бы центрировал окно вокруг интересующей меня точки. Теперь вам нужно только поиграть с окном и условиями, когда нужно удалить выбросы. Попробуйте окно 30 и когда точка будет в 2 раза или в два раза меньше медианы. Или используйте вместо этого функцию findpeaks и поиграйте с ней.   -  person Zizy Archer    schedule 22.03.2017
comment
@ Dev-il Я могу это использовать, но мой сигнал может иметь разные уровни (я буду обрабатывать разные сигналы). Ziizy лучник, это может быть хорошей идеей, я попробую центрировать точку в окне и увеличить размер ot. спасибо   -  person Isra    schedule 23.03.2017


Ответы (2)


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

s=rand(500,1)*5; 
s(ceil(rand(1,20)*500))=rand(1,20)*100; 
maxs=max(s);

figure
subplot(211); plot(s);

thr=10;
med_s=medfilt2(s,[10,1]); 
s(s>med_s+thr)=med_s(s>med_s+thr);
subplot(212); plot(s); ylim([0 maxs])

введите здесь описание изображения

person Ozcan    schedule 22.03.2017

Если вы можете перейти на R2017a, вы можете проверить filloutliers функция. Существуют различные методы, которые вы можете использовать для обнаружения всплесков, а также множество вариантов их заполнения.

Если вы хотите получить медианный фильтр, но только для пиков, вы можете указать 'movmedian' в качестве метода поиска и 'center' в качестве метода заполнения.

person CKT    schedule 22.03.2017
comment
Это хорошая идея, я мог бы скачать пробную версию и посмотреть результаты. - person Isra; 23.03.2017