1

j'ai le signal suivant qui contient des données déforméesSuppression des pointes d'un signal Matlab

Raw signal

Je suis en train d'enlever les pointes sans endommager mon signal, j'ai essayé la fonction medfilt1 mais lissé le bon signal qui n'est pas voulu. Le filtrage ne peut pas être utilisé en raison du chevauchement de fréquence entre le signal voulu et le signal indésirable. J'ai essayé aussi une fenêtre mobile qui comparera la valeur avec la médiane de cette fenêtre et si le point est beaucoup plus élevé que ce sera le mettre à la médiane comme indiqué ci-dessous:

%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 

J'ai exterminé les pointes, mais aussi quelques-uns des pics distincts du signal ont été partis comme le montre la figure ci-dessous

Output of actual program

Comment puis-je obtenir le meilleur débruitage d'une manière simple?

Merci

+0

Avez-vous essayé: http://stackoverflow.com/questions/27432883/finding-peaks-matlab/27439621#27439621 –

+0

Dans ** ce cas spécifique **, et seulement si c'est ** à des fins de présentation ** , il semble que vous pouvez simplement supprimer (ou régler 'NaN') toutes les valeurs inférieures à environ 350 et supérieures à 550. –

+0

Votre code semble généralement OK, bien que je centre la fenêtre autour du point qui m'intéresse. Maintenant, vous avez seulement besoin de jouer avec la fenêtre et les conditions quand enlever les valeurs aberrantes. Essayez la fenêtre de 30 et lorsque le point est 2x ou la moitié de la médiane. Ou utilisez plutôt la fonction findpeaks et jouez avec celle-là. –

Répondre

1

Vous pouvez utiliser le filtre médian ou filtre à moyenne mobile. Quel que soit le filtre, vous devez utiliser une sorte de seuil. Seuilz les pointes et remplacez-les par le résultat de votre filtre.

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]) 

enter image description here

0

Si vous pouvez passer à R2017a, vous pouvez vérifier la fonction filloutliers. Il existe différentes méthodes que vous pouvez utiliser pour détecter les pics, et de même une variété de choix quant à la façon de les remplir.

Si vous souhaitez obtenir un filtre médian, mais uniquement sur les pics, vous pouvez spécifier 'movmedian' comme méthode de recherche et 'center' comme méthode de remplissage.

+0

C'est une bonne idée, je pourrais télécharger l'essai et voir les résultats. – Isra