이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
findpeaks
국소 최댓값 구하기
구문
설명
[___] = findpeaks(___,
는 위에 열거된 구문에 나와 있는 입력 인수 중 하나와 함께 이름-값 인수를 사용하여 옵션을 지정합니다.Name,Value
)
findpeaks(___)
(출력 인수 없음)는 신호를 플로팅하고 피크 값을 겹칩니다.
예제
벡터에서 피크 찾기
3개의 피크를 갖는 벡터를 정의하고 플로팅합니다.
data = [25 8 15 5 6 10 10 3 1 20 7]; plot(data)
국소 최댓값을 구합니다. 피크가 나타나는 순서대로 출력됩니다. 첫 번째 샘플은 최댓값이지만 피크에 포함되지 않습니다. 평탄한 피크의 경우, 이 함수는 가장 작은 인덱스를 갖는 점만 반환합니다.
pks = findpeaks(data)
pks = 1×3
15 10 20
출력 인수 없이 findpeaks
를 사용하여 피크를 표시합니다.
findpeaks(data)
피크와 피크의 위치 찾기
종형 곡선의 합으로 구성된 신호를 생성합니다. 각 곡선의 위치, 높이, 폭을 지정합니다.
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)
findpeaks
를 디폴트 설정과 함께 사용하여 신호의 피크와 해당 피크의 위치를 찾습니다.
[pks,locs] = findpeaks(PeakSig,x);
findpeaks
를 사용하여 피크를 플로팅하고 피크에 레이블을 지정합니다.
findpeaks(PeakSig,x) text(locs+.02,pks,num2str((1:numel(pks))'))
가장 높은 피크부터 가장 짧은 피크로 피크를 정렬합니다.
[psor,lsor] = findpeaks(PeakSig,x,'SortStr','descend'); findpeaks(PeakSig,x) text(lsor+.02,psor,num2str((1:numel(psor))'))
피크 돌출부
한 주기 전체의 코사인 위에 놓인 종형 곡선의 합으로 구성된 신호를 생성합니다. 각 곡선의 위치, 높이, 폭을 지정합니다.
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)
findpeaks
를 사용하여 돌출부가 최소 4인 피크를 찾아 플로팅합니다.
findpeaks(PeakSig,x,'MinPeakProminence',4,'Annotate','extents')
가장 높은 피크와 가장 낮은 피크만 조건을 충족합니다.
모든 피크의 돌출부를 표시하고 돌출부 절반에서의 폭을 표시합니다.
[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)
서로 매우 가까이 있는 피크를 무시하여 주기 기간에 대한 추정값을 향상시킵니다. 피크를 다시 구하고 플로팅하되, 이번에는 허용 가능한 피크 간 분리를 6년보다 큰 값으로 제한합니다.
findpeaks(avSpots,year,'MinPeakDistance',6)
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')
datetime
기능을 사용하여 평균 태양 흑점 주기를 계산합니다.
dttmCycle = years(mean(diff(lk)))
dttmCycle = 10.9600
데이터를 사용하여 타임테이블을 생성합니다. 시간 변수를 연도 단위로 지정합니다. 데이터를 플로팅합니다. 타임테이블의 마지막 5개 항목을 표시합니다.
TT = timetable(years(year),avSpots); plot(TT.Time,TT.Variables)
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)
진폭이 최소 1V인 피크를 구합니다.
findpeaks(select,Fs,'MinPeakHeight',1)
인접 샘플보다 최소 1V 더 높은 피크를 구합니다.
findpeaks(select,Fs,'Threshold',1)
신호가 더 높은 값에 도달하기 전에 어느 쪽에서든 최소 1V 하강한 피크를 구합니다.
findpeaks(select,Fs,'MinPeakProminence',1)
포화(Saturate)된 신호의 피크
데이터가 지정된 포화 지점보다 큰 경우 센서는 잘린 측정값을 반환할 수 있습니다. 이러한 피크를 무의미한 것으로 무시하거나 분석에 통합할 수 있습니다.
분산이 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)')
신호의 피크를 찾습니다. findpeaks
는 평탄한 각 피크에서는 상승하는 경계만 보고합니다.
[pk,lc] = findpeaks(s,t); hold on plot(lc,pk,'x')
'Threshold'
이름-값 쌍을 사용하여 평탄한 피크를 제외시킵니다. 피크와 해당 이웃 사이에 의 최소 진폭 차이가 필요합니다.
[pkt,lct] = findpeaks(s,t,'Threshold',1e-4); plot(lct,pkt,'o','MarkerSize',12)
피크 폭 결정하기
종형 곡선의 합으로 구성된 신호를 생성합니다. 각 곡선의 위치, 높이, 폭을 지정합니다.
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
돌출부의 절반을 기준으로 사용하여 피크의 폭을 측정합니다.
findpeaks(PeakSig,x,'Annotate','extents')
폭을 다시 측정하되, 이번에는 높이의 절반을 기준으로 사용합니다.
findpeaks(PeakSig,x,'Annotate','extents','WidthReference','halfheight') title('Signal Peak Widths')
입력 인수
data
— 입력 데이터
벡터
입력 데이터로, 벡터로 지정됩니다. data
는 실수여야 하며 적어도 3개의 요소를 가져야 합니다.
데이터형: double
| single
x
— 위치
벡터 | datetime
형 배열
위치로, 벡터나 datetime
형 배열로 지정됩니다. x
는 단조 증가(Monotonically Increasing)해야 하고 data
와 길이가 같아야 합니다. x
가 생략된 경우 data
의 인덱스가 위치로 사용됩니다.
데이터형: double
| single
| datetime
Fs
— 샘플 레이트
양의 스칼라
샘플 레이트로, 양의 스칼라로 지정됩니다. 샘플 레이트는 단위 시간당 샘플 개수입니다. 시간 단위가 초이면 샘플 레이트의 단위는 헤르츠입니다.
데이터형: double
| single
이름-값 인수
선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN
으로 지정합니다. 여기서 Name
은 인수 이름이고 Value
는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.
R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name
을 따옴표로 묶으십시오.
예: 'SortStr','descend','NPeaks',3
은 신호에서 가장 높은 피크 3개를 찾습니다.
NPeaks
— 최대 피크 수
양의 정수 스칼라
반환할 최대 피크 수로, 양의 정수 스칼라로 지정됩니다. findpeaks
는 입력 데이터의 첫 번째 요소에서 동작을 시작하여 피크 수가 'NPeaks'
의 값에 도달하면 동작을 종료합니다.
데이터형: double
| single
SortStr
— 피크 정렬
'none'
(디폴트 값) | 'ascend'
| 'descend'
피크 정렬로, 다음 값 중 하나로 지정됩니다.
'none'
은 피크를 입력 데이터에서 나타나는 순서대로 반환합니다.'ascend'
는 피크를 가장 작은 값부터 가장 큰 값으로, 오름차순으로 반환합니다.'descend'
는 피크를 가장 큰 값부터 가장 작은 값으로, 내림차순으로 반환합니다.
MinPeakHeight
— 최소 피크 높이
-Inf
(디폴트 값) | 실수형 스칼라
최소 피크 높이로, 실수형 스칼라로 지정됩니다. findpeaks
가 'MinPeakHeight'
보다 높은 피크만 반환하도록 하려면 이 인수를 사용하십시오. 최소 피크 높이를 지정하면 처리 시간을 줄일 수 있습니다.
데이터형: double
| single
MinPeakProminence
— 최소 피크 돌출부
0 (디폴트 값) | 실수형 스칼라
최소 피크 돌출부로, 실수형 스칼라로 지정됩니다. findpeaks
가 상대적 중요도가 최소 'MinPeakProminence'
인 피크만 반환하도록 하려면 이 인수를 사용하십시오. 자세한 내용은 돌출부 항목을 참조하십시오.
데이터형: double
| single
Threshold
— 최소 높이 차이
0 (디폴트 값) | 음이 아닌 실수형 스칼라
피크와 그 이웃 사이의 최소 높이 차이로, 음이 아닌 실수형 스칼라로 지정됩니다. findpeaks
가 바로 인접한 값들을 최소한 'Threshold'
값만큼 초과하는 피크만 반환하도록 하려면 이 인수를 사용하십시오.
데이터형: double
| single
MinPeakDistance
— 최소 피크 분리
0 (디폴트 값) | 양의 실수형 스칼라
최소 피크 분리로, 양의 실수형 스칼라로 지정됩니다. 'MinPeakDistance'
의 값을 지정하면 알고리즘이 신호에서 가장 높은 피크를 선택하고 이 피크에서 'MinPeakDistance'
내에 있는 모든 피크를 무시합니다. 그런 다음 이 함수는 남아 있는 가장 높은 피크에 대해 절차를 반복하고, 더 이상 고려할 피크가 없을 때까지 이 작업을 반복합니다.
findpeaks
가 크기가 상대적으로 큰 피크의 근방에서 나타나는 작은 피크를 무시하도록 하려면 이 인수를 사용하십시오.
데이터형: double
| single
| duration
WidthReference
— 폭 측정값의 기준 높이
'halfprom'
(디폴트 값) | 'halfheight'
폭 측정값의 기준 높이로, 'halfprom'
또는 'halfheight'
로 지정됩니다. findpeaks
는 하강하는 신호가 가로 기준선을 교차하는 점 사이의 거리로 피크의 너비를 추정합니다. 선의 높이는 'WidthReference'
에 지정된 기준을 사용하여 선택됩니다.
'halfprom'
은 피크 아래로 피크 돌출부의 절반에 해당하는 세로 거리에 기준선을 배치합니다. 자세한 내용은 돌출부 항목을 참조하십시오.'halfheight'
는 피크 높이의 절반에 기준선을 배치합니다. 이 선은 교차점 중 하나라도'MinPeakHeight'
,'MinPeakProminence'
,'Threshold'
를 설정하여 선택된 피크의 경계 밖에 있는 경우 잘립니다. 피크 사이의 경계는 피크 사이에 있는 가장 낮은 골의 가로 위치로 정의됩니다. 높이가 0보다 작은 피크는 삭제됩니다.
교차점의 위치는 선형 보간으로 계산됩니다.
MinPeakWidth
— 최소 피크 폭
0 (디폴트 값) | 양의 실수형 스칼라
최소 피크 폭으로, 양의 실수형 스칼라로 지정됩니다. 폭이 최소 'MinPeakWidth'
인 피크만 선택하려면 이 인수를 사용하십시오.
데이터형: double
| single
| duration
MaxPeakWidth
— 최대 피크 폭
Inf
(디폴트 값) | 양의 실수형 스칼라
최대 피크 폭으로, 양의 실수형 스칼라로 지정됩니다. 폭이 최대 'MaxPeakWidth'
인 피크만 선택하려면 이 인수를 사용하십시오.
데이터형: double
| single
| duration
Annotate
— 플롯 스타일
'peaks'
(디폴트 값) | 'extents'
플롯 스타일로, 다음 값 중 하나로 지정됩니다.
'peaks'
는 신호를 플로팅하고 모든 피크의 위치와 값에 대한 주석을 지정합니다.'extents'
는 신호를 플로팅하고 모든 피크의 위치, 값, 폭, 돌출부에 대한 주석을 지정합니다.
이 인수는 findpeaks
를 출력 인수와 함께 호출하는 경우 무시됩니다.
출력 인수
pks
— 국소 최댓값
벡터
국소 최댓값으로, 신호 값으로 구성된 벡터로 반환됩니다. 국소 최댓값이 없을 경우 pks
가 비어 있습니다.
w
— 피크 폭
벡터
피크 폭으로, 실수로 구성된 벡터로 반환됩니다. 각 피크의 폭은 높이가 WidthReference
로 지정된 기준선과 신호과 교차하는 피크의 왼쪽과 오른쪽에 있는 점 사이의 거리로 계산됩니다. 이 점 자체는 선형 보간으로 구합니다.
p
— 피크 돌출부
벡터
피크 돌출부로, 실수로 구성된 벡터로 반환됩니다. 피크의 돌출부는 신호가 피크보다 높은 수준으로 다시 올라가거나 끝점에 도달하기 전에, 피크의 어느 한 쪽이든 하강해야 하는 최소 세로 거리입니다. 자세한 내용은 돌출부 항목을 참조하십시오.
세부 정보
돌출부
피크의 돌출부는 피크가 고유한 높이와 다른 피크에 대한 상대적 위치로 인해 얼마나 두드러지는지를 측정합니다. 고립된 낮은 피크가, 그보다 높지만 키가 큰 범위에 속해 있어 눈에 띄지 않는 피크보다 더 두드러질 수 있습니다.
피크의 돌출부를 측정하려면 다음을 수행하십시오.
피크에 마커를 표시합니다.
가로선이 다음 중 하나에 해당될 때까지 가로선을 피크에서 왼쪽과 오른쪽으로 확장합니다.
신호를 가로지릅니다. 이는 더 높은 피크가 있기 때문입니다.
신호의 왼쪽 끝이나 오른쪽 끝에 도달합니다.
2단계에서 정의된 두 구간 각각에서 신호의 최솟값을 구합니다. 이 점은 신호 끝점 중 하나이거나 골입니다.
두 구간의 최솟값 중 더 높은 값이 기준 레벨로 지정됩니다. 이 레벨보다 위에 있는 피크의 높이는 해당 돌출부입니다.
findpeaks
는 신호 끝점의 높이가 얼마든 이 끝점을 넘는 신호의 동작에 대해 어떠한 가정도 하지 않습니다. 결과적으로 2단계와 4단계는 끝점을 벗어난 신호의 동작을 무시하며, 이는 종종 기준 레벨의 값에 영향을 미칩니다. 예를 들어, 다음과 같은 신호의 피크가 있다고 가정하겠습니다.
피크 번호 | 왼쪽 구간이 피크와 다음 사이에 있음 | 오른쪽 구간이 피크와 다음 사이에 있음 | 왼쪽 구간에서 가장 낮은 점 | 오른쪽 구간에서 가장 낮은 점 | 기준 레벨(가장 높은 최솟값) |
---|---|---|---|---|---|
1 | 왼쪽 끝 | 피크 2와의 교차 지점 | 왼쪽 끝점 | a | a |
2 | 왼쪽 끝 | 오른쪽 끝 | 왼쪽 끝점 | h | 왼쪽 끝점 |
3 | 피크 2와의 교차 지점 | 피크 4와의 교차 지점 | b | c | c |
4 | 피크 2와의 교차 지점 | 피크 6과의 교차 지점 | b | d | b |
5 | 피크 4와의 교차 지점 | 피크 6과의 교차 지점 | d | e | e |
6 | 피크 2와의 교차 지점 | 오른쪽 끝 | d | h | d |
7 | 피크 6과의 교차 지점 | 피크 8과의 교차 지점 | f | g | g |
8 | 피크 6과의 교차 지점 | 오른쪽 끝 | f | h | f |
9 | 피크 8과의 교차 지점 | 오른쪽 끝점과의 교차 지점 | h | i | i |
확장 기능
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
GPU 배열
Parallel Computing Toolbox™를 사용해 GPU(그래픽스 처리 장치)에서 실행하여 코드 실행 속도를 높일 수 있습니다.
이 함수는 GPU 배열을 완전히 지원합니다. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오.
버전 내역
R2007b에 개발됨
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)