측정 된 신호의 피크 감지
우리는 데이터 수집 카드를 사용하여 신호를 최대치까지 증가시킨 다음 원래 값 근처로 떨어지는 장치에서 판독 값을 가져옵니다. 피크 값을 찾기 위해 현재 배열에서 가장 높은 판독 값을 검색하고 인덱스를 사용하여 계산에 사용되는 피크 값의 타이밍을 결정합니다.
가장 높은 값이 우리가 찾고있는 피크이면 잘 작동하지만 장치가 제대로 작동하지 않으면 초기 피크보다 높을 수있는 두 번째 피크를 볼 수 있습니다. 90 초 동안 16 개의 장치에서 초당 10 회 판독을 수행합니다.
나의 초기 생각은 피크를 찾고 피크 배열을 구성하기 위해 이전 및 다음 포인트가 현재보다 작은 지 확인하기 위해 판독 치를 순환하는 것입니다. 시스템의 노이즈를 허용하기 위해 현재 위치의 양쪽에있는 여러 지점의 평균을 조사해야 할 수도 있습니다. 이것이 진행하는 가장 좋은 방법입니까 아니면 더 나은 기술이 있습니까?
우리는 LabVIEW를 사용하고 LAVA 포럼 을 확인했으며 흥미로운 예가 많이 있습니다. 이것은 우리 테스트 소프트웨어의 일부이며 너무 많은 비표준 VI 라이브러리를 사용하지 않으려 고 노력하고 있으므로 특정 코드가 아닌 관련 프로세스 / 알고리즘에 대한 피드백을 기대했습니다.
신호 평균화를 시도 할 수 있습니다. 즉, 각 포인트에 대해 주변 3 개 이상의 포인트로 값을 평균화 할 수 있습니다. 노이즈 블립이 크면 이것도 도움이되지 않을 수 있습니다.
이것이 언어에 구애받지 않는다는 것을 알고 있지만, LabView를 사용하고 있다고 생각하면 평활화 및 노이즈 감소를 수행하는 데 사용할 수있는 LabView와 함께 제공되는 사전 패키지 신호 처리 VI가 많이 있습니다. NI 포럼은 이런 종류의 물건에 대한보다 전문적인 도움을 얻을 수있는 좋은 장소입니다.
고전적인 피크 감지 방법이 많이 있으며 그중 어느 것이 든 작동 할 수 있습니다. 특히 데이터의 품질을 제한하는 것이 무엇인지 확인해야합니다. 다음은 기본 설명입니다.
두 데이터의 포인트 사이
(x(0), y(0))
와(x(n), y(n))
, 합계y(i + 1) - y(i)
에 대한0 <= i < n
이와 전화T
( "여행")와 세트R
로 ( "상승")를y(n) - y(0) + k
적절하게 작은을위한k
.T/R > 1
피크를 나타냅니다. 노이즈로 인한 큰 이동이 거의 발생하지 않거나 노이즈가 기본 곡선 모양을 중심으로 대칭 적으로 분포하는 경우 정상적으로 작동합니다. 응용 프로그램의 경우 주어진 임계 값을 초과하는 점수로 가장 빠른 피크를 수락하거나 더 흥미로운 속성에 대한 상승 값당 이동 곡선을 분석합니다.일치하는 필터를 사용하여 표준 피크 모양과의 유사성을 평가합니다 (본질적으로 유사성의 코사인 메트릭을 얻기 위해 일부 모양에 대해 정규화 된 내적을 사용).
표준 피크 모양에 대해 디컨 볼브하고 높은 값을 확인합니다 (단순한 계측 출력의 경우 2가 노이즈에 덜 민감하다는 것을 종종 발견하지만).
데이터를 매끄럽게하고 삼각형 부등식에 의존하는
x0 < x1 < x2, y1 > 0.5 * (y0 + y2)
다음과 같은 유클리드 거리를 확인D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2))
합니다. 단순 비율을 사용하면 점수 매기기가 다시 제공됩니다.매우 간단한 2- 가우스 혼합 모델을 데이터에 맞 춥니 다 (예 : Numerical Recipes에는 기성품 코드 덩어리가 있습니다). 더 이른 피크를 취하십시오. 이것은 겹치는 피크를 올바르게 처리합니다.
데이터에서 단순 가우시안, 코시, 푸 아송 또는 what-have-you 곡선과 가장 일치하는 것을 찾습니다. 광범위한 범위에서이 곡선을 평가하고 피크 위치를 확인한 후 데이터 사본에서 빼십시오. 반복. 모델 매개 변수 (아마도 표준 편차이지만 일부 응용 프로그램에서는 첨도 또는 기타 기능에 관심이 있음)가 일부 기준을 충족하는 가장 빠른 피크를 선택합니다. 데이터에서 피크를 뺄 때 남겨진 아티팩트를 조심하십시오. 베스트 매치는 위의 # 2에서 제안 된 매치 점수의 종류에 따라 결정될 수 있습니다.
저는 이전에했던 일을했습니다. DNA 염기 서열 데이터에서 피크 찾기, 측정 된 곡선에서 추정 된 파생물에서 피크 찾기, 히스토그램에서 피크 찾기.
적절한 기준선에주의 깊게 참석할 것을 권장합니다. Wiener 필터링 또는 기타 필터링 또는 간단한 히스토그램 분석은 노이즈가있을 때 쉽게 기준을 설정하는 방법입니다.
마지막으로, 데이터가 일반적으로 잡음이 있고 참조되지 않은 단일 종단 출력 (또는 참조 된, 차등이 아닌)으로 카드에서 데이터를 가져오고 각 데이터 포인트에 대해 많은 관측치를 평균화하는 경우 해당 데이터를 정렬 해보십시오. 관찰하고 첫 번째 및 마지막 사 분위수를 버리고 남은 것을 평균화합니다. 정말 유용 할 수있는 이러한 이상치 제거 전략이 많이 있습니다.
이 문제는 좀 더 자세히 연구되었습니다.
ROOT (핵 / 입자 물리학 분석 도구) TSpectrum*
클래스에는 최신 구현 세트가 있습니다 . 코드는 1 ~ 3 차원 데이터에서 작동합니다.
ROOT 소스 코드를 사용할 수 있으므로 원하는 경우이 구현을 가져올 수 있습니다.
로부터 TSpectrum의 클래스에 대한 설명 :
이 클래스에 사용 된 알고리즘은 다음 참조에 게시되었습니다.
[1] M. Morhac et al .: 다차원 일치 감마선 스펙트럼에 대한 배경 제거 방법. 물리학 연구에서의 핵 기기 및 방법 A 401 (1997) 113- 132.
[2] M. Morhac et al .: 효율적인 1 차원 및 2 차원 Gold deconvolution과 감마선 스펙트럼 분해에 적용. 물리학 연구에서의 핵 기기 및 방법 A 401 (1997) 385-408.
[3] M.Morhac et al .: 다차원 일치 감마선 스펙트럼에서 피크 식별. 연구 물리학에서의 핵기구 및 방법 A 443 (2000), 108-125.
논문은 NIM 온라인 구독이없는 분들을 위해 수업 문서에서 링크되었습니다.
수행되는 작업의 짧은 버전은 노이즈를 제거하기 위해 히스토그램을 평평하게 한 다음 평탄화 된 히스토그램에서 무차별 대입으로 로컬 최대 값을 감지하는 것입니다.
이 스레드에 내가 직접 개발 한 알고리즘에 기여하고 싶습니다 .
이는 분산 원리를 기반으로합니다 . 새 데이터 포인트가 일부 이동 평균에서 떨어진 주어진 x 수의 표준 편차이면 알고리즘 신호 ( z-score 라고도 함 )입니다. 알고리즘은 신호가 임계 값을 손상시키지 않도록 별도의 이동 평균과 편차를 구성하기 때문에 매우 강력 합니다. 따라서 미래 신호는 이전 신호의 양에 관계없이 거의 동일한 정확도로 식별됩니다. 알고리즘은 lag = the lag of the moving window
, threshold = the z-score at which the algorithm signals
및 influence = the influence (between 0 and 1) of new signals on the mean and standard deviation
. 예를 들어, lag
5 개 중 a 는 마지막 5 개 관측치를 사용하여 데이터를 평활화합니다. threshold
3.5의 A 는 데이터 포인트가 이동 평균에서 3.5 표준 편차 떨어져 있으면 신호를 보냅니다. 및 influence
0.5는 신호 제공 절반일반 데이터 포인트가 갖는 영향. 마찬가지로 influence
0의 값은 새 임계 값을 재 계산하기 위해 신호를 완전히 무시합니다. 따라서 0의 영향이 가장 강력한 옵션입니다.
다음과 같이 작동합니다.
의사 코드
# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function
# Settings (the ones below are examples: choose what is best for your data)
set lag to 5; # lag 5 for the smoothing functions
set threshold to 3.5; # 3.5 standard deviations for signal
set influence to 0.5; # between 0 and 1, where 1 is normal influence, 0.5 is half
# Initialise variables
set signals to vector 0,...,0 of length of y; # Initialise signal results
set filteredY to y(1,...,lag) # Initialise filtered series
set avgFilter to null; # Initialise average filter
set stdFilter to null; # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag)); # Initialise first value
set stdFilter(lag) to std(y(1,...,lag)); # Initialise first value
for i=lag+1,...,t do
if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
if y(i) > avgFilter(i-1)
set signals(i) to +1; # Positive signal
else
set signals(i) to -1; # Negative signal
end
# Adjust the filters
set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
set avgFilter(i) to mean(filteredY(i-lag,i),lag);
set stdFilter(i) to std(filteredY(i-lag,i),lag);
else
set signals(i) to 0; # No signal
# Adjust the filters
set filteredY(i) to y(i);
set avgFilter(i) to mean(filteredY(i-lag,i),lag);
set stdFilter(i) to std(filteredY(i-lag,i),lag);
end
end
데모
> 원래 답변
이 방법은 기본적으로 David Marr의 저서 "Vision"에서 가져온 것입니다.
가우스는 예상되는 피크 폭으로 신호를 흐리게 처리합니다. 이렇게하면 노이즈 스파이크가 제거되고 위상 데이터가 손상되지 않습니다.
그런 다음 에지 감지 (LOG가 수행)
그런 다음 가장자리는 피처의 가장자리 (예 : 피크)였습니다. 모서리 사이에서 피크를 찾고 크기별로 피크를 정렬하면 완료됩니다.
나는 이것에 대한 변형을 사용했으며 매우 잘 작동합니다.
I think you want to cross-correlate your signal with an expected, exemplar signal. But, it has been such a long time since I studied signal processing and even then I didn't take much notice.
I don't know very much about instrumentation, so this might be totally impractical, but then again it might be a helpful different direction. If you know how the readings can fail, and there is a certain interval between peaks given such failures, why not do gradient descent at each interval. If the descent brings you back to an area you've searched before, you can abandon it. Depending upon the shape of the sampled surface, this also might help you find peaks faster than search.
Is there a qualitative difference between the desired peak and the unwanted second peak? If both peaks are "sharp" -- i.e. short in time duration -- when looking at the signal in the frequency domain (by doing FFT) you'll get energy at most bands. But if the "good" peak reliably has energy present at frequencies not existing in the "bad" peak, or vice versa, you may be able to automatically differentiate them that way.
You could apply some Standard Deviation to your logic and take notice of peaks over x%.
참고URL : https://stackoverflow.com/questions/3260/peak-detection-of-measured-signal
'programing tip' 카테고리의 다른 글
Pandas에서 색인 이름 제거 (0) | 2020.12.08 |
---|---|
Docker 분리 모드 (0) | 2020.12.08 |
Linux에서 PHP를 사용하여 Word 문서 만들기 (0) | 2020.12.08 |
== 또는 .Equals () (0) | 2020.12.08 |
Safari 브라우저를 사용하여 요소를 검사하는 방법 (0) | 2020.12.07 |