2017-08-17 32 views
0

我有一個信號,我想在我的信號中添加一個高原(展平),以便找到當地的最大值。更新:用本地最大值可視化信號

我在這裏提供了一個例子,使我的問題更易於理解,因爲我的真實數據的大小是1x1666520,所以我無法在此處上傳整個文件。

我想要做什麼,我期待:

•我想讓我的信號平坦,我們會發現在信號局部最大值。

•我想將窗口應用於信號,以便在一定範圍內可視化展平的效果,並且更深入,更清晰地顯示我的信號。我也想控制窗口的大小和寬度。

這裏的輸出應該如何看素描

Sketch with flattened local maxima

我在點5,1,7,8局部極大值,4

當我在當地的最大值,我希望我的信號變得平坦(剪輯),併成爲圍繞該點的直線。

我也想控制扁平的寬度。假設寬度爲0.2,如我在手繪中所提到的那樣。如果是這樣,我想使它成爲0.3,所以我還需要控制裁剪部分的寬度。更清晰

更新的詳細信息:

我在做什麼:

我有2個信號。來自傳感器的第一參考信號和第二測量信號。 (我從1個傳感器獲取了6個不同的測量信號)。

測得的信號有延遲,偏移,變平。

我想讓我的參考信號看起來像我的測量信號,通過延遲,偏移和展平信號來滿足我的需求。

爲了使我的原始信號變平坦,我觀察到,在每個局部最大值處,信號都變得平坦,每次測量變平坦都不一樣。

所以我想讓我的信號在每個本地最大值都保持平坦。

Y軸:平坦化(我想控制在y軸上平坦化的高度)

意味着我想使一個環,其包含在Y軸例如平坦化在第一次嘗試我的變化值的高度想在第二次嘗試中給扁平0.1,然後給扁平爲0.2的局部最大值並觀察它們的效果。 簡而言之,當我有局部最大值時,所以我想給出y軸上最大值的(locs - 0.1)變平。

意思是說,如果我在5點達到高峯,所以我想在4.9(5-0.1)壓扁。 然後在第二個循環中檢查y軸上局部最大值處的(locs-0.2)的效果。

想要對0.1到0.9的值應用循環。

X軸:壓扁的寬度(我想改變平坦化的寬度)

意味着我想觀察在通過給出一個數值範圍的平坦的寬度變化的影響。這可以通過循環的幫助完成。

簡而言之,當我有局部最大值時,所以我想在x軸的最大值上給出0.1的展平寬度。

然後在第二個循環中檢查x軸上局部最大值的0.2寬度變化的效果。

enter image description here

原始數據細節:

我在原來的數據x軸包含小數所以不想插值數據值。

在我的原始數據中,y軸還包含小數點後的值。

我真實數據的大小是1x1666520。

原始信號看起來像

enter image description here

窗口作用:

窗口只是觀察發生在地方局部最大的變化行爲意味着一樣,如果變平的寬度爲0.1所以窗戶大概是0.2。

對不起,我仍然無法提供一個很好的示例數據,解釋了我在MATLAB中的情況,所以我附上了手工草圖。 我希望我能保持清晰的問題。

代碼:

t = 1:25 ; 
A = [1 0 1 2 3 5 0 1 0 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2]; 
[pks,locs] = findpeaks(A) 

win1 = hamming(numel(A))'; 
xw1 = win1.*A; 

figure 
plot(t,xw1,'r',t,A,'b') 

修改代碼喬恩的建議壓扁

喬恩給了一個想法之前和最大值後再考慮價值觀,使他們相同的最大值,以使寬度可控。

t = 1:25 ; 
A = [1 0 1 2 3 5 0 1 0 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2]; 
[pks,locs] = findpeaks(A) 
% A(A>locs)=locs 
figure 
plot(t,A,'b') 
A(locs+1) = A(locs); 
A(locs-1) = A(locs); 
hold all;plot(t,A,'r'); 

enter image description here

  • 更新問題:

請看看在信號原始信號和量化步長附圖。其實我很抱歉,我仍然無法上傳整個數據文件。

enter image description here 其實我的原始信號包含步長爲0.001的小數點。所以我的信號被採樣和量化。

通過做內插法,它可以很好地使信號平坦化,但不幸的是它消除了原始信號的量化,而且內插法使得該過程非常緩慢。

是否有任何其他方式在局部最大值點剪切信號?

我會很感激你的幫助,因爲我在這個階段無能爲力。

我試過並測試過約翰提供的代碼。它運作良好,但問題與我的數據。 IT包含量化步驟。

要點:

  1. 我的原始數據在步驟或量化。
  2. 它包含大小爲0.001的小數點,因此通過對x軸和y軸進行插值來完成。因此,我的數據和時間包含差值爲0.001的點。
  3. 通過做插值它工作完美,但問題是,它正在消除信號的量化。

如果有人幫助我,我會非常感激你。

請求:

如果你有疑問,請向,所以我就可以讓我更好的查詢。

+2

你想如何壓平它?因爲第一個明顯的答案是'A(A> mymax)= mymax' –

+0

非常感謝Ander Birgui。所以在我的情況下,對於上面的例子,我得到pks在5,7,4意味着局部極大值,所以現在我想要的是讓我的信號平坦意味着在本地極大值處的直線5,7,4達到某個值意味着我的信號得到當它看到局部最大值時,在x軸上平展2點。請看附圖。我希望它能夠澄清我的觀點,這也是我也希望將窗口應用於信號的原因,以便我可以清楚地看到展平效果。 – Peter

+0

在上面附圖中綠色信號顯示扁平化的效果,這就是我想要處理的信號 – Peter

回答

2

不知道你在找什麼,特別是窗口。對於「x軸上的2點」展平可能會使本地最大值與先前的值相同?

從您的代碼繼續:

figure 
plot(t,A,'b') 
A(locs) = A(locs-1); 
hold all;plot(t,A,'r'); 

enter image description here


編輯 整個代碼:

t = 1:25 ; 
A = [1 0 1 2 3 5 0 1 0 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2]; 
t2=1:0.1:25; 
A = interp1(t,A,t2); %re-make example data to have decimal points on the x-axis 
t=t2; 
[pks,locs] = findpeaks(A); 
figure 
plot(t,A,'b') 

windowWidth_x2 = 2; %define how wide, this is 0.2, because the x-axis increments by 0.1 

valuesToClipTo = A(locs-windowWidth_x2); %No idea what you actually want 
for ii=1:length(locs) %Explaining is futile 
    A((locs(ii)-windowWidth_x2):((locs(ii)-windowWidth_x2)-1+find(A((locs(ii)-windowWidth_x2):end)<valuesToClipTo(ii),1,'first'))) = valuesToClipTo(ii); 
end 
hold all;plot(t,A,'r'); 

+0

喬恩這是我正在尋找扁平部分正是我想要做的。非常感謝您的時間和幫助,關於窗口我只需要在窗口上應用窗口讓我們舉一個例子,我需要將窗口大小(5)應用到我的信號上,並且希望在窗口持續時間內可視化我的信號,這就是我試圖做的應用試圖應用窗口來可視化我製作的信號。 – Peter

+0

喬恩1更多東西對不起,我現在可視化這個邏輯是偉大的,但如果我想只是下面的一個值下降,並使其平坦意味着在這種情況下之前本地最大值8我的值爲0,所以它將我的圖拉下來0但我希望它使信號平坦意味着8的直線,5的直線,4的直線等。對不起,我深深地想象它,所以我才知道這個問題。這是否有一些邏輯? – Peter

+1

不知道你的意思,因爲我不知道我知道你的目標。也許使下一個值與本地最大值相同? 'A(locs + 1)= A(locs);' – 2017-08-17 16:17:04