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 firsPoint và lastPoint. 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
@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