正如你給我寄了另一個數據集是從你這裏張貼了一個完全不同的,我會解釋另一種方法來處理你的數據。
爲了完整起見,你可以找到數據,如下圖設置的一個細節:
在左側你可以看到完整的數據集,而右邊是一個細節。與之前的數據集相比,我們發現每個峯都不是恆定的水平,我們也不需要像以前那樣以最近鄰居的方式進行插值。
首先,我以前的答案在整個數據集上運行得非常慢(我的部分編碼很差),但它很可能工作不好,因爲所有峯值可能不會被投影到正確的值(例如,圖像最常用的值是4,4.1和0(其次是-4.05和其他))。這會導致我以前的算法失敗。爲了規避這個問題,選擇兩個閾值水平是我們構建預測變量的一個很容易的事情:大於正閾值的東西被認爲是恆定正值,小於負閾值的東西被認爲是負常數,在之間被認爲是零。
通過選擇體面的閾值,可以得到相當強大的重建:
你可以看到綠色的重建,而閾值顯示爲紅色虛線線。應該可以根據實際數據自動選擇這些閾值;但是我把它留給你(看看我以前的代碼,以瞭解你如何解決這個問題)。
相應的源代碼:
thresholdNeg = -3;
idxNeg = RealData<thresholdNeg;
valueNeg = mean(RealData(idxNeg));
thresholdPos = 3;
idxPos = RealData>thresholdPos;
valuePos = mean(RealData(idxPos));
reconData = zeros(size(RealData));
reconData(idxPos) = valuePos;
reconData(idxNeg) = valueNeg;
n = numel(reconData);
plot(RealData,'b'); hold on;
plot(reconData,'-gx');
plot([1 n NaN n 1],[thresholdPos thresholdPos NaN thresholdNeg thresholdNeg], 'r--');
編輯: 如果你想,如果你放大近似恆定的水平,以保持包含在高和低的水平信號(的任何信息,可以注意到另一個信號的存在),則可以使用反向閾值技術:將信號保留在任何地方,但將信號置於0
,其中信號在閾值之間。
Great Egon!奇蹟般有效 !你讓我今天一整天都感覺很好 !太感謝了 ! – tgv