2017-04-05 46 views
-1

說我有,看起來有點像這樣一個信號:enter image description here消除MatLab中信號平坦區域的最佳方法?

我MatLab中我處理,我將不得不使用擺脫中間的平緩區域的哪些功能?有什麼功能可以做到這一點,還是我需要自己編程?目前,我只是有一個空白的功能,因爲我不知道從哪裏開始:

function removala = removal(a, b) 

end 

有沒有快速的功能,可以將其刪除或做我只是必須尋找低於閾值的所有值,並刪除他們自己?參考a和b是幅度點的向量。

+3

你可能需要通過即將開始,接近0 以客觀的定義「flattish」;) –

+0

0.75以下的任何東西,即在峯值之間 – Display

+1

你會如何「移除」這些點?你會將它們設置爲零還是子集,以便它們從輸出中消失(即子採樣)? – rayryeng

回答

1

使用findpeaks

% generating signal 
x = 1:0.1:10; 
y = rand(size(x))*0.5; 
y([5,25,84]) = [6,-5.5,7.5]; 
z = y; 
thresh = 0.75; % height threshold 
% find peaks 
[pks,locs] = findpeaks(z,'MinPeakProminence',thresh); 
% remove signal noise between peaks 
for ii = 1:length(locs)-1 
    zz = z(locs(ii)+1:locs(ii+1)-1); 
    zz(abs(zz) < thresh) = 0; 
    z(locs(ii)+1:locs(ii+1)-1) = zz; 
end 
% plot 
plot(x,y); 
hold on 
plot(x,z); 
plot(x(locs),pks,'og'); 
legend('original signal','modified signal','peaks') 

enter image description here

+0

優秀的答案,讓我在正確的方向,謝謝! – Display

1

你可能想刪除其絕對功率小於某一閾值的信號。 所以你的函數的兩個輸入將是原始信號和閾值。該函數將輸出一個變量「cleanSignal」

function cleanSignal = removal(rawSignal,threshold) 

最簡單的實現。刪除低於閾值的數據。如果rawSignal是一個矩陣,那麼結果變量將是一個矢量連接所有高於閾值的時期。

ind = abs(rawSignal)<threshold; 
rawSignal(ind) = []; 
cleanSignal = rawSignal; 

這可能不是您想要的行爲,因爲您要保留rawSignal矩陣的原始形狀。所以你可以「低估」低於閾值的值。

ind = abs(rawSignal)<threshold; 
rawSignal(ind) = nan; 
cleanSignal = rawSignal; 
end 

注意,這並不能真正消除平坦的信號,但是信號如果你真的要刪除平坦的信號,你應該使用

ind = abs(diff(rawSignal))<threshold; 
相關問題