2012-01-05 25 views
12

enter image description hereLàm thế nào để phân biệt giữa một đỉnh đôi và một mảng đỉnh đơn trong MATLAB?

Làm thế nào để phân biệt giữa một đỉnh đôi và một mảng đỉnh đơn?

Ngoài ra nếu mảng đại diện cho một đỉnh kép, cách tìm điểm tối thiểu giữa hai đỉnh? Các điểm tối thiểu bên ngoài các đỉnh (trái của đỉnh trái và phải của đỉnh phải) không được xem xét trong việc tìm điểm tối thiểu.

+0

@Nzbuu: Đây đã làm với xử lý tín hiệu. Không phải mọi tín hiệu đều là hình ảnh. – Jonas

Trả lời

8

tôi thấy PEAKDET chức năng là khá đáng tin cậy và nhanh chóng mặc dù nó lặp dựa. Nó không yêu cầu làm mịn trước dữ liệu nhiễu, nhưng tìm thấy extrema tối đa và cực đại cục bộ với sự khác biệt lớn hơn tham số delta.

Vì PEAKDET chạy từ trái sang phải, đôi khi bạn bỏ lỡ các đỉnh ở đúng vị trí. Để tránh nó, tôi thích chạy nó hai lần:

%# some data 
n = 100; 
x = linspace(0,3*pi,n); 
y = sin(x) + rand(1,n)/5; 

%# run peakdet twice left-to-right and right-to-left 
delta = 0.5; 
[ymaxtab, ymintab] = peakdet(y, delta, x); 
[ymaxtab2, ymintab2] = peakdet(y(end:-1:1), delta, x(end:-1:1)); 
ymaxtab = unique([ymaxtab; ymaxtab2],'rows'); 
ymintab = unique([ymintab; ymintab2],'rows'); 

%# plot the curve and show extreme points based on number of peaks 
plot(x,y) 
hold on 
if size(ymaxtab,1) == 2 && size(ymintab,1) == 1 %# if double peak 
    plot(ymintab(:,1),ymintab(:,2),'r.','markersize',30) 
elseif size(ymaxtab,1) == 1 && size(ymintab,1) == 0 %# if single peak 
    plot(ymaxtab(:,1),ymaxtab(:,2),'r.','markersize',30) 
else %# if more (or less) 
    plot(ymintab(:,1),ymintab(:,2),'r.','markersize',30) 
    plot(ymaxtab(:,1),ymaxtab(:,2),'r.','markersize',30) 
end 
hold off 

Two peaks example

+0

Cảm ơn bạn, PEAKDET là một cách tiếp cận tốt. Một bất lợi - nó bắt đầu tìm kiếm từ cực lồi. – 23W

+0

@yuk delta tham số làm gì trong peakdet – kkk

+0

Tham số delta cơ bản thiết lập mức độ dao động bạn muốn bỏ qua. Hãy thử thay đổi nó và xem nó sẽ ảnh hưởng như thế nào đến kết quả. – yuk

8

Dưới đây là một thuật toán có thể hoạt động tùy thuộc vào mức độ nhiễu của tín hiệu. Ở đây tôi xác định một đỉnh là tập các điểm kết nối lớn hơn giá trị ngưỡng đã cho.

Giả sử dữ liệu gốc của bạn nằm trong mảng A. Đầu tiên, hãy tìm một ngưỡng:

t = (max(A)+min(A))/2; 

Tiếp theo, tìm tất cả các điểm lớn hơn ngưỡng này t: số

P = A>t; 

Tính của mục điểm nổi bật mà lớn hơn t sử dụng bwlabel

L = bwlabel(P); 
numberOfPeaks = max(L); 

Bây giờ numberOfPeaks nên cho bạn biết số lượng đỉnh (điểm kết nối lớn hơn giá trị ngưỡng) bạn có trong dữ liệu của mình

Bây giờ để tìm điểm tối thiểu giữa hai đỉnh chúng ta cần xác định những điểm tách riêng hai đỉnh bằng ma trận nhãn L.

firstPoint = find(L==1,1,'last')+1; 
lastPoint = find(L==2,1,'first')-1; 

Vì vậy, các thung lũng giữa hai đỉnh đầu tiên là những điểm với chỉ số giữa firsPointlastPoint. Tối thiểu sau đó sẽ là

minValue = min(A(firstPoint:lastPoint)); 

Giải pháp mà không phụ thuộc vào Image Processing Toolbox

Như @Nzbuu ghi nhận Aboth dựa vào xử lý hình ảnh chức năng hộp công cụ bwlabel. Vì vậy, đây là cách để tránh điều đó. Đầu tiên, tôi Giả sử rằng mảng P xác định chính xác các điểm thuộc đỉnh (P (i) = 1) và các thuộc về các thung lũng (P (i) = - 1). Nếu đây là trường hợp ranh giới giữa các đỉnh và thung lũng có thể được xác định khi dP = P(i+1)-P(i) = 1 hoặc -1.

dP = diff(P); 

Để tính toán số lượng đỉnh chỉ cần tính tổng số 1 trong dP:

numberOfPeaks = sum(dP==1); 

Và những điểm xác định các thung lũng đầu tiên là giữa

firstPoint = find(dP==-1,1,'first')+1 %# the -1 represents the last point of the peak so add 1 
lastPoint = find(dP==1,2,'first'); #% Find the start of the second peak 
lastPoint = lastPoint(end); #% Keep the last value 
+0

Tôi nghĩ rằng một giải pháp không sử dụng hộp công cụ xử lý hình ảnh sẽ hữu ích hơn. – Nzbuu

+0

@Nzbuu Tôi đã đồng ý và thêm phương thức thứ hai. – Azim

5

Bạn có thể tìm thấy những địa phương tối thiểu/tối đa như sau:

x = 0:.1:4*pi; 
y = sin(x); 

plot(x,y) 

diffy = diff(y); 
localMin = find(diffy(1:end-1)<=0 & diffy(2:end) > 0)+1; 
localMax = find(diffy(1:end-1)>=0 & diffy(2:end) < 0)+1; 

hold on 
plot(x(localMin),y(localMin),'dg') 
plot(x(localMax),y(localMax),'*r') 

Kết quả bằng: enter image description here

Về cơ bản, bạn đang tìm nơi đồng bằng giữa các giá trị y thay đổi dấu hiệu. Nếu dữ liệu của bạn ồn ào, điều này sẽ gây ra nhiều giá trị tối thiểu/tối đa địa phương và bạn có thể cần phải lọc dữ liệu của mình.

Để tìm giá trị tối thiểu giữa hai đỉnh bạn có thể làm một cái gì đó như thế này:

if numel(localMax) == 1 
    fprintf('The max value is: %f',y(localMax)); 
elseif numel(localMax > 1) 
    betweenPeaksIndex = localMin(localMin > localMax(1) & localMin <localMax(2)); 
    fprintf('The min between the first 2 peaks is: %f',y(betweenPeaksIndex)); 
else 
    fprintf('The was no local Max ..???'); 
end 
+3

Nói chung, tôi sẽ đi cho một cái gì đó như thế này, nhưng bạn có thể cần phải mịn dữ liệu của bạn trước khi bạn sử dụng nó nếu bạn muốn tránh tiếng ồn ảnh hưởng đến kết quả. – Nzbuu

+0

@Nzbuu Đồng ý, đó là lý do tại sao tôi có báo trước về tiếng ồn. Giải pháp sẽ phụ thuộc vào các đặc điểm của tập dữ liệu của bạn. I.e nếu nó ồn ào, bạn sẽ có nhiều khả năng phải áp dụng một bộ lọc đầu tiên và các đặc tính tín hiệu/tiếng ồn sẽ xác định loại bộ lọc nào là cần thiết. –

+1

@Aero Engy, tôi đoán tôi đã bỏ lỡ điều đó:/Tuy nhiên, phục vụ để làm nổi bật vấn đề. – Nzbuu

Các vấn đề liên quan