說我有,看起來有點像這樣一個信號:消除MatLab中信號平坦區域的最佳方法?
我MatLab中我處理,我將不得不使用擺脫中間的平緩區域的哪些功能?有什麼功能可以做到這一點,還是我需要自己編程?目前,我只是有一個空白的功能,因爲我不知道從哪裏開始:
function removala = removal(a, b)
end
有沒有快速的功能,可以將其刪除或做我只是必須尋找低於閾值的所有值,並刪除他們自己?參考a和b是幅度點的向量。
說我有,看起來有點像這樣一個信號:消除MatLab中信號平坦區域的最佳方法?
我MatLab中我處理,我將不得不使用擺脫中間的平緩區域的哪些功能?有什麼功能可以做到這一點,還是我需要自己編程?目前,我只是有一個空白的功能,因爲我不知道從哪裏開始:
function removala = removal(a, b)
end
有沒有快速的功能,可以將其刪除或做我只是必須尋找低於閾值的所有值,並刪除他們自己?參考a和b是幅度點的向量。
使用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')
優秀的答案,讓我在正確的方向,謝謝! – Display
你可能想刪除其絕對功率小於某一閾值的信號。 所以你的函數的兩個輸入將是原始信號和閾值。該函數將輸出一個變量「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;
你可能需要通過即將開始,接近0 以客觀的定義「flattish」;) –
0.75以下的任何東西,即在峯值之間 – Display
你會如何「移除」這些點?你會將它們設置爲零還是子集,以便它們從輸出中消失(即子採樣)? – rayryeng