1

卸下尖峯我有一個包含一些扭曲的數據從信號Matlab的

以下信號

Raw signal

我試圖刪除這些尖峯而不會破壞我的信號,我已經試過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 

我已經擺脫了尖峯但也有一些信號的不同峯都消失瞭如圖所示波紋管

Output of actual program

如何實現一個簡單的方法最好的降噪?

謝謝

+0

您是否嘗試過:http://stackoverflow.com/questions/27432883/finding-peaks-matlab/27439621#27439621 –

+0

在**這個特定的情況**,並且只有當這是**用於演示目的** ,它看起來像你可以刪除(或設置爲'NaN')低於約350和550以上的所有值。 –

+0

你的代碼看起來總體上可以,但我會圍繞我感興趣的點進行調整。現在你只需要玩窗口和條件何時去除異常值。嘗試30的窗口,當點是中位數的2倍或一半。或者使用findpeaks函數來玩那個。 –

回答

1

您可以使用中值濾波器或移動平均濾波器。無論過濾器是什麼,你都需要使用某種閾值。閾值尖峯並將其替換爲您的過濾結果。

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

如果你可以升級到R2017a,你可能要檢查出filloutliers功能。有多種方法可以用來檢測尖峯,同樣有多種選擇來決定如何填充它們。

如果你想基本上得到一箇中值濾波器,但只能在尖峯上,那麼你可以指定'movmedian'作爲find方法,'center'作爲填充方法。

+0

這是個好主意,我可以下載試用版並查看結果。 – Isra