Main Content

findpeaks

국소 최댓값 구하기

설명

예제

pks = findpeaks(data)는 입력 신호 벡터 data의 국소 최댓값(피크)을 가진 벡터를 반환합니다. 국소 피크는 2개의 인접 샘플보다 크거나 Inf와 같은 데이터 샘플입니다. 피크가 나타나는 순서대로 출력됩니다. Inf가 아닌 신호 끝점은 제외됩니다. 피크가 평탄하면 이 함수는 가장 작은 인덱스를 가진 점만 반환합니다.

예제

[pks,locs] = findpeaks(data)는 피크가 나타나는 지점의 인덱스도 추가로 반환합니다.

예제

[pks,locs,w,p] = findpeaks(data)는 추가로 벡터 w로 피크의 폭을 반환하고 벡터 p로 피크의 돌출부를 반환합니다.

예제

[___] = findpeaks(data,x)x를 위치 벡터로 지정하고 위에 열거된 구문에 나와 있는 출력 인수 중 하나를 반환합니다. locswx의 값으로 표현됩니다.

예제

[___] = findpeaks(data,Fs)는 데이터의 샘플 레이트 Fs를 지정합니다. data의 첫 번째 샘플은 시간 0에서 가져온 것으로 간주됩니다. locsw는 시간 단위로 변환됩니다.

예제

[___] = findpeaks(___,Name,Value)는 위에 열거된 구문에 나와 있는 입력 인수 중 하나와 함께 이름-값 인수를 사용하여 옵션을 지정합니다.

예제

findpeaks(___)(출력 인수 없음)는 신호를 플로팅하고 피크 값을 겹칩니다.

예제

모두 축소

3개의 피크를 갖는 벡터를 정의하고 플로팅합니다.

data = [25 8 15 5 6 10 10 3 1 20 7];
plot(data)

Figure contains an axes object. The axes object contains an object of type line.

국소 최댓값을 구합니다. 피크가 나타나는 순서대로 출력됩니다. 첫 번째 샘플은 최댓값이지만 피크에 포함되지 않습니다. 평탄한 피크의 경우, 이 함수는 가장 작은 인덱스를 갖는 점만 반환합니다.

pks = findpeaks(data)
pks = 1×3

    15    10    20

출력 인수 없이 findpeaks를 사용하여 피크를 표시합니다.

findpeaks(data)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

종형 곡선의 합으로 구성된 신호를 생성합니다. 각 곡선의 위치, 높이, 폭을 지정합니다.

x = linspace(0,1,1000);

Pos = [1 2 3 5 7 8]/10;
Hgt = [3 4 4 2 2 3];
Wdt = [2 6 3 3 4 6]/100;

for n = 1:length(Pos)
    Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss);

개별 곡선과 그 합을 플로팅합니다.

plot(x,Gauss,'--',x,PeakSig)

Figure contains an axes object. The axes object contains 7 objects of type line.

findpeaks를 디폴트 설정과 함께 사용하여 신호의 피크와 해당 피크의 위치를 찾습니다.

[pks,locs] = findpeaks(PeakSig,x);

findpeaks를 사용하여 피크를 플로팅하고 피크에 레이블을 지정합니다.

findpeaks(PeakSig,x)

text(locs+.02,pks,num2str((1:numel(pks))'))

Figure contains an axes object. The axes object contains 8 objects of type line, text. One or more of the lines displays its values using only markers

가장 높은 피크부터 가장 짧은 피크로 피크를 정렬합니다.

[psor,lsor] = findpeaks(PeakSig,x,'SortStr','descend');

findpeaks(PeakSig,x)

text(lsor+.02,psor,num2str((1:numel(psor))'))

Figure contains an axes object. The axes object contains 8 objects of type line, text. One or more of the lines displays its values using only markers

한 주기 전체의 코사인 위에 놓인 종형 곡선의 합으로 구성된 신호를 생성합니다. 각 곡선의 위치, 높이, 폭을 지정합니다.

x = linspace(0,1,1000);

base = 4*cos(2*pi*x);

Pos = [1 2 3 5 7 8]/10;
Hgt = [3 7 5 5 4 5];
Wdt = [1 3 3 4 2 3]/100;

for n = 1:length(Pos)
    Gauss(n,:) =  Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss)+base;

개별 곡선과 그 합을 플로팅합니다.

plot(x,Gauss,'--',x,PeakSig,x,base)

Figure contains an axes object. The axes object contains 8 objects of type line.

findpeaks를 사용하여 돌출부가 최소 4인 피크를 찾아 플로팅합니다.

findpeaks(PeakSig,x,'MinPeakProminence',4,'Annotate','extents')

Figure contains an axes object. The axes object contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent signal, peak, prominence, width (half-prominence).

가장 높은 피크와 가장 낮은 피크만 조건을 충족합니다.

모든 피크의 돌출부를 표시하고 돌출부 절반에서의 폭을 표시합니다.

[pks,locs,widths,proms] = findpeaks(PeakSig,x);
widths
widths = 1×6

    0.0154    0.0431    0.0377    0.0625    0.0274    0.0409

proms
proms = 1×6

    2.6816    5.5773    3.1448    4.4171    2.9191    3.6363

태양 흑점은 주기적 현상입니다. 태양 흑점의 수는 대략 11년마다 피크에 도달한다고 알려져 있습니다.

1700년부터 1987년까지 매년 관측된 태양 흑점의 평균 개수가 포함된 파일 sunspot.dat를 불러옵니다. 최댓값을 구하여 플로팅합니다.

load sunspot.dat

year = sunspot(:,1);
avSpots = sunspot(:,2);

findpeaks(avSpots,year)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

서로 매우 가까이 있는 피크를 무시하여 주기 기간에 대한 추정값을 향상시킵니다. 피크를 다시 구하고 플로팅하되, 이번에는 허용 가능한 피크 간 분리를 6년보다 큰 값으로 제한합니다.

findpeaks(avSpots,year,'MinPeakDistance',6)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

findpeaks에서 반환된 피크 위치를 사용하여 최댓값 사이의 평균 구간을 계산합니다.

[pks,locs] = findpeaks(avSpots,year,'MinPeakDistance',6);

meanCycle = mean(diff(locs))
meanCycle = 10.9600

연도 데이터를 사용하여 datetime형 배열을 생성합니다. 매년 춘분에 가까운 3월 20일에 태양 흑점의 수를 세었다고 가정합니다. 태양 흑점 개수가 피크에 도달한 연도를 구합니다. years 함수를 사용하여 duration형으로 최소 피크 분리를 지정합니다.

ty = datetime(year,3,20);

[pk,lk] = findpeaks(avSpots,ty,'MinPeakDistance',years(6));

plot(ty,avSpots,lk,pk,'o')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

datetime 기능을 사용하여 평균 태양 흑점 주기를 계산합니다.

dttmCycle = years(mean(diff(lk)))
dttmCycle = 10.9600

데이터를 사용하여 타임테이블을 생성합니다. 시간 변수를 연도 단위로 지정합니다. 데이터를 플로팅합니다. 타임테이블의 마지막 5개 항목을 표시합니다.

TT = timetable(years(year),avSpots);
plot(TT.Time,TT.Variables)

Figure contains an axes object. The axes object contains an object of type line.

entries = TT(end-4:end,:)
entries=5×1 timetable
      Time      avSpots
    ________    _______

    1983 yrs     66.6  
    1984 yrs     45.9  
    1985 yrs     17.9  
    1986 yrs     13.4  
    1987 yrs     29.3  

7418Hz로 샘플링된 오디오 신호를 불러옵니다. 200개 샘플을 선택합니다.

load mtlb
select = mtlb(1001:1200);

최소 5ms로 분리된 피크를 구합니다.

이 제약 조건을 적용하기 위해 findpeaks는 신호에서 가장 높은 피크를 선택하고 이로부터 5ms 이내에 있는 모든 피크를 제거합니다. 그런 다음 이 함수는 남아 있는 가장 높은 피크에 대해 절차를 반복하고, 더 이상 고려할 피크가 없을 때까지 이 작업을 반복합니다.

findpeaks(select,Fs,'MinPeakDistance',0.005)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

진폭이 최소 1V인 피크를 구합니다.

findpeaks(select,Fs,'MinPeakHeight',1)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

인접 샘플보다 최소 1V 더 높은 피크를 구합니다.

findpeaks(select,Fs,'Threshold',1)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

신호가 더 높은 값에 도달하기 전에 어느 쪽에서든 최소 1V 하강한 피크를 구합니다.

findpeaks(select,Fs,'MinPeakProminence',1)

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

데이터가 지정된 포화 지점보다 큰 경우 센서는 잘린 측정값을 반환할 수 있습니다. 이러한 피크를 무의미한 것으로 무시하거나 분석에 통합할 수 있습니다.

분산이 0.1²인 백색 가우스 잡음에 포함되어 있는, 5Hz와 3Hz 주파수의 삼각 함수의 곱으로 구성된 신호를 생성합니다. 이 신호는 100Hz의 속도로 1초 동안 샘플링됩니다. 재현 가능한 결과를 얻기 위해 난수 생성기를 재설정합니다.

rng default

fs = 1e2;
t = 0:1/fs:1-1/fs;

s = sin(2*pi*5*t).*sin(2*pi*3*t)+randn(size(t))/10;

지정된 경계 0.32보다 큰 모든 측정값을 잘라서 포화된 측정값을 시뮬레이션합니다. 포화된 신호를 플로팅합니다.

bnd = 0.32;
s(s>bnd) = bnd;

plot(t,s)
xlabel('Time (s)')

Figure contains an axes object. The axes object with xlabel Time (s) contains an object of type line.

신호의 피크를 찾습니다. findpeaks는 평탄한 각 피크에서는 상승하는 경계만 보고합니다.

[pk,lc] = findpeaks(s,t);

hold on
plot(lc,pk,'x')

Figure contains an axes object. The axes object with xlabel Time (s) contains 2 objects of type line. One or more of the lines displays its values using only markers

'Threshold' 이름-값 쌍을 사용하여 평탄한 피크를 제외시킵니다. 피크와 해당 이웃 사이에 10-4의 최소 진폭 차이가 필요합니다.

[pkt,lct] = findpeaks(s,t,'Threshold',1e-4);

plot(lct,pkt,'o','MarkerSize',12)

Figure contains an axes object. The axes object with xlabel Time (s) contains 3 objects of type line. One or more of the lines displays its values using only markers

종형 곡선의 합으로 구성된 신호를 생성합니다. 각 곡선의 위치, 높이, 폭을 지정합니다.

x = linspace(0,1,1000);

Pos = [1 2 3 5 7 8]/10;
Hgt = [4 4 2 2 2 3];
Wdt = [3 8 4 3 4 6]/100;

for n = 1:length(Pos)
    Gauss(n,:) =  Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss);

개별 곡선과 그 합을 플로팅합니다.

plot(x,Gauss,'--',x,PeakSig)
grid

Figure contains an axes object. The axes object contains 7 objects of type line.

돌출부의 절반을 기준으로 사용하여 피크의 폭을 측정합니다.

findpeaks(PeakSig,x,'Annotate','extents')

Figure contains an axes object. The axes object contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent signal, peak, prominence, width (half-prominence).

폭을 다시 측정하되, 이번에는 높이의 절반을 기준으로 사용합니다.

findpeaks(PeakSig,x,'Annotate','extents','WidthReference','halfheight')
title('Signal Peak Widths')

Figure contains an axes object. The axes object with title Signal Peak Widths contains 6 objects of type line. One or more of the lines displays its values using only markers These objects represent signal, peak, height, width (half-height), border.

입력 인수

모두 축소

입력 데이터로, 벡터로 지정됩니다. data는 실수여야 하며 적어도 3개의 요소를 가져야 합니다.

데이터형: double | single

위치로, 벡터나 datetime형 배열로 지정됩니다. x는 단조 증가(Monotonically Increasing)해야 하고 data와 길이가 같아야 합니다. x가 생략된 경우 data의 인덱스가 위치로 사용됩니다.

데이터형: double | single | datetime

샘플 레이트로, 양의 스칼라로 지정됩니다. 샘플 레이트는 단위 시간당 샘플 개수입니다. 시간 단위가 초이면 샘플 레이트의 단위는 헤르츠입니다.

데이터형: double | single

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: 'SortStr','descend','NPeaks',3은 신호에서 가장 높은 피크 3개를 찾습니다.

반환할 최대 피크 수로, 양의 정수 스칼라로 지정됩니다. findpeaks는 입력 데이터의 첫 번째 요소에서 동작을 시작하여 피크 수가 'NPeaks'의 값에 도달하면 동작을 종료합니다.

데이터형: double | single

피크 정렬로, 다음 값 중 하나로 지정됩니다.

  • 'none'은 피크를 입력 데이터에서 나타나는 순서대로 반환합니다.

  • 'ascend'는 피크를 가장 작은 값부터 가장 큰 값으로, 오름차순으로 반환합니다.

  • 'descend'는 피크를 가장 큰 값부터 가장 작은 값으로, 내림차순으로 반환합니다.

최소 피크 높이로, 실수형 스칼라로 지정됩니다. findpeaks'MinPeakHeight'보다 높은 피크만 반환하도록 하려면 이 인수를 사용하십시오. 최소 피크 높이를 지정하면 처리 시간을 줄일 수 있습니다.

데이터형: double | single

최소 피크 돌출부로, 실수형 스칼라로 지정됩니다. findpeaks가 상대적 중요도가 최소 'MinPeakProminence'인 피크만 반환하도록 하려면 이 인수를 사용하십시오. 자세한 내용은 돌출부 항목을 참조하십시오.

데이터형: double | single

피크와 그 이웃 사이의 최소 높이 차이로, 음이 아닌 실수형 스칼라로 지정됩니다. findpeaks가 바로 인접한 값들을 최소한 'Threshold' 값만큼 초과하는 피크만 반환하도록 하려면 이 인수를 사용하십시오.

데이터형: double | single

최소 피크 분리로, 양의 실수형 스칼라로 지정됩니다. 'MinPeakDistance'의 값을 지정하면 알고리즘이 신호에서 가장 높은 피크를 선택하고 이 피크에서 'MinPeakDistance' 내에 있는 모든 피크를 무시합니다. 그런 다음 이 함수는 남아 있는 가장 높은 피크에 대해 절차를 반복하고, 더 이상 고려할 피크가 없을 때까지 이 작업을 반복합니다.

  • 위치 벡터 x를 지정하는 경우 'MinPeakDistance'x의 값으로 표현되어야 합니다. xdatetime형 배열이면 'MinPeakDistance'duration형 스칼라나 일수로 표현된 숫자형 스칼라로 지정합니다.

  • 샘플 레이트 Fs를 지정하는 경우 'MinPeakDistance'는 시간 단위로 표현되어야 합니다.

  • xFs를 모두 지정하지 않을 경우 'MinPeakDistance'는 샘플 단위로 표현되어야 합니다.

findpeaks가 크기가 상대적으로 큰 피크의 근방에서 나타나는 작은 피크를 무시하도록 하려면 이 인수를 사용하십시오.

데이터형: double | single | duration

폭 측정값의 기준 높이로, 'halfprom' 또는 'halfheight'로 지정됩니다. findpeaks는 하강하는 신호가 가로 기준선을 교차하는 점 사이의 거리로 피크의 너비를 추정합니다. 선의 높이는 'WidthReference'에 지정된 기준을 사용하여 선택됩니다.

  • 'halfprom'은 피크 아래로 피크 돌출부의 절반에 해당하는 세로 거리에 기준선을 배치합니다. 자세한 내용은 돌출부 항목을 참조하십시오.

  • 'halfheight'는 피크 높이의 절반에 기준선을 배치합니다. 이 선은 교차점 중 하나라도 'MinPeakHeight', 'MinPeakProminence', 'Threshold'를 설정하여 선택된 피크의 경계 밖에 있는 경우 잘립니다. 피크 사이의 경계는 피크 사이에 있는 가장 낮은 골의 가로 위치로 정의됩니다. 높이가 0보다 작은 피크는 삭제됩니다.

교차점의 위치는 선형 보간으로 계산됩니다.

최소 피크 폭으로, 양의 실수형 스칼라로 지정됩니다. 폭이 최소 'MinPeakWidth'인 피크만 선택하려면 이 인수를 사용하십시오.

  • 위치 벡터 x를 지정하는 경우 'MinPeakWidth'x의 값으로 표현되어야 합니다. xdatetime형 배열이면 'MinPeakWidth'duration형 스칼라나 일수로 표현된 숫자형 스칼라로 지정합니다.

  • 샘플 레이트 Fs를 지정하는 경우 'MinPeakWidth'는 시간 단위로 표현되어야 합니다.

  • xFs를 모두 지정하지 않을 경우 'MinPeakWidth'는 샘플 단위로 표현되어야 합니다.

데이터형: double | single | duration

최대 피크 폭으로, 양의 실수형 스칼라로 지정됩니다. 폭이 최대 'MaxPeakWidth'인 피크만 선택하려면 이 인수를 사용하십시오.

  • 위치 벡터 x를 지정하는 경우 'MaxPeakWidth'x의 값으로 표현되어야 합니다. xdatetime형 배열이면 'MaxPeakWidth'duration형 스칼라나 일수로 표현된 숫자형 스칼라로 지정합니다.

  • 샘플 레이트 Fs를 지정하는 경우 'MaxPeakWidth'는 시간 단위로 표현되어야 합니다.

  • xFs를 모두 지정하지 않을 경우 'MaxPeakWidth'는 샘플 단위로 표현되어야 합니다.

데이터형: double | single | duration

플롯 스타일로, 다음 값 중 하나로 지정됩니다.

  • 'peaks'는 신호를 플로팅하고 모든 피크의 위치와 값에 대한 주석을 지정합니다.

  • 'extents'는 신호를 플로팅하고 모든 피크의 위치, 값, 폭, 돌출부에 대한 주석을 지정합니다.

이 인수는 findpeaks를 출력 인수와 함께 호출하는 경우 무시됩니다.

출력 인수

모두 축소

국소 최댓값으로, 신호 값으로 구성된 벡터로 반환됩니다. 국소 최댓값이 없을 경우 pks가 비어 있습니다.

피크 위치로, 벡터로 반환됩니다.

  • 위치 벡터 x를 지정할 경우 locs는 피크 인덱스에서 x의 값을 포함합니다.

  • 샘플 레이트 Fs를 지정할 경우 locs는 연속 샘플 간에 시간 차 1/Fs을 갖는 시점으로 구성된 숫자형 벡터입니다.

  • xFs를 모두 지정하지 않을 경우 locs는 정수 인덱스로 구성된 벡터입니다.

피크 폭으로, 실수로 구성된 벡터로 반환됩니다. 각 피크의 폭은 높이가 WidthReference로 지정된 기준선과 신호과 교차하는 피크의 왼쪽과 오른쪽에 있는 점 사이의 거리로 계산됩니다. 이 점 자체는 선형 보간으로 구합니다.

  • 위치 벡터 x를 지정하면 폭이 x의 값으로 표현됩니다.

  • 샘플 레이트 Fs를 지정하면 폭이 시간 단위로 표현됩니다.

  • xFs를 모두 지정하지 않을 경우 폭은 샘플 단위로 표현됩니다.

피크 돌출부로, 실수로 구성된 벡터로 반환됩니다. 피크의 돌출부는 신호가 피크보다 높은 수준으로 다시 올라가거나 끝점에 도달하기 전에, 피크의 어느 한 쪽이든 하강해야 하는 최소 세로 거리입니다. 자세한 내용은 돌출부 항목을 참조하십시오.

세부 정보

모두 축소

돌출부

피크의 돌출부는 피크가 고유한 높이와 다른 피크에 대한 상대적 위치로 인해 얼마나 두드러지는지를 측정합니다. 고립된 낮은 피크가, 그보다 높지만 키가 큰 범위에 속해 있어 눈에 띄지 않는 피크보다 더 두드러질 수 있습니다.

피크의 돌출부를 측정하려면 다음을 수행하십시오.

  1. 피크에 마커를 표시합니다.

  2. 가로선이 다음 중 하나에 해당될 때까지 가로선을 피크에서 왼쪽과 오른쪽으로 확장합니다.

    • 신호를 가로지릅니다. 이는 더 높은 피크가 있기 때문입니다.

    • 신호의 왼쪽 끝이나 오른쪽 끝에 도달합니다.

  3. 2단계에서 정의된 두 구간 각각에서 신호의 최솟값을 구합니다. 이 점은 신호 끝점 중 하나이거나 골입니다.

  4. 두 구간의 최솟값 중 더 높은 값이 기준 레벨로 지정됩니다. 이 레벨보다 위에 있는 피크의 높이는 해당 돌출부입니다.

findpeaks는 신호 끝점의 높이가 얼마든 이 끝점을 넘는 신호의 동작에 대해 어떠한 가정도 하지 않습니다. 결과적으로 2단계와 4단계는 끝점을 벗어난 신호의 동작을 무시하며, 이는 종종 기준 레벨의 값에 영향을 미칩니다. 예를 들어, 다음과 같은 신호의 피크가 있다고 가정하겠습니다.

Signal with nine peaks, numbered 1 through 9 from left to right. The valleys between each pair of peaks are labeled from left to right with the letters a through i. In decreasing order of height, the peaks are 2, 6, 1, 8, 4, which is equal to 8, 7, 3, 9, and 5. In decreasing order of height, the valleys are a, g, c, i, f, b, which is equal to f, e, d, and h. For this signal, peak 6 has the highest prominence, even though it is lower than peak 2.

피크 번호왼쪽 구간이 피크와 다음 사이에 있음오른쪽 구간이 피크와 다음 사이에 있음왼쪽 구간에서 가장 낮은 점오른쪽 구간에서 가장 낮은 점기준 레벨(가장 높은 최솟값)
1왼쪽 끝피크 2와의 교차 지점왼쪽 끝점aa
2왼쪽 끝오른쪽 끝왼쪽 끝점h왼쪽 끝점
3피크 2와의 교차 지점피크 4와의 교차 지점bcc
4피크 2와의 교차 지점피크 6과의 교차 지점bdb
5피크 4와의 교차 지점피크 6과의 교차 지점dee
6피크 2와의 교차 지점오른쪽 끝dhd
7피크 6과의 교차 지점피크 8과의 교차 지점fgg
8피크 6과의 교차 지점오른쪽 끝fhf
9피크 8과의 교차 지점오른쪽 끝점과의 교차 지점hii

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2007b에 개발됨