상세 컨텐츠

본문 제목

[파이썬 find_peaks 함수] 신호처리의 꽃 피크 찾기

프로그래밍/Python

by 척척석사 민준 2021. 10. 9. 13:59

본문

728x90

대기압 플라즈마(특히 DBD)의 전류데이터를 분석해보면 전류신호가 마치 노이즈 처럼 삐죽삐죽 솟아있는 경우가 있다.
어떤 저자는 생선가시 같은 모양이라고도 하는데, 커패시터에 흐르는 변위전류보다 플라즈마가 발생할 때 생기는 전류가 더 크기 때문에 이런 전류그래프가 그려진다. (아래 붉은색은 전압, 파란색은 전류 그래프이다)

플라즈마가 발생할 때 전류신호에 짧은 펄스가 생기게 되는데
각 전류펄스의 에너지를 계산하고 전자밀도 등을 계산하려면 피크의 길이와 크기를 알아야 한다.
파이썬 라이브러리중 과학 계산 라이브러리인 scipy를 사용해서 피크를 찾아보겠다.

사용방법은 다음과 같은데 변수 peaks에 피크위치를 저장한다.

peaks, _ = scipy.signal.find_peaks(피크를 찾을 데이터 셋)

find_peaks 함수는 다양한 옵션이 있는데 피크 값을 잘 찾아내는데에 가장 중요한 옵션은
prominence이다. 영어로는 중요도라는 의미인데,
분석하는 데이터에서 피크들의 상대적인 크기를 정하는 것이다.
이게 너무 작으면 전류피크가 아닌 노이즈도 함께 피크로 잡히게 된다.
노이즈를 잡지 않으려고 width 옵션을 넣어서 sampling period의 두배를 최소값으로 지정했다.

peaks, _ = scipy.signal.find_peaks(분석데이터 셋, width = 2*sampling_period)

그럼에도 노이즈만 잡혀서 나름 머리를 쓴게 prominence 값을 찾고
그 다음 prominence의 사분위수를 찾은 다음에 중간값 이상만을 가지고 가자라는 거였다.
노이즈들의 prominence는 값이 작기 때문에 사분위수로 보면 0~50 사이에 분포되어있었다.

prominences = scipy.signal.peak_prominences(데이터셋, peaks)[0]
prominence_new = numpy.percentile(prominences, [0, 25, 50, 75, 100], interpolation='nearest')[2]
# 새로 찾은 prominence를 이용해 다시 피크를 찾는다
peaks, _ = find_peaks(데이터셋, prominence = prominence_new)
# 새로 찾은 피크데이터를 이용해 prominence 계산
prominence = scipy.signal.peak_prominences(데이터셋, peaks)[0]
# 노이즈가 없는 피크값들의 길이를 측정한다 (펄스의 지속시간)
widths = scipy.signal.peak_widths(데이터셋, peaks, rel_heigh = 0.5)


찾아낸 전류피크를 x로 시각화했다.

방법을 요약하면 다음과 같다.


조금 복잡해보이지만... DBD 플라즈마 전류데이터가 워낙에 분석하기가 어렵다보니
플라즈마가 생김으로 인해 생기는 전류피크만을 찾아기가 힘들다.
DBD의 경우는 스트리머의 전류가 어떤 규칙성을 가지고 생기는게 아니기 때문에(전극거리가 완벽하게 동일할 수가 없고 부분적으로 전기장이 강한 곳에서 방전이 생기기 때문에 펄스간 간격이 일정하지 않다) distance나 threshold 옵션으로는 노이즈를 가려낼 수가 없었다.

DBD 플라즈마의 전류전압 측정데이터를 이용해 방전에너지, 커패시턴스, 펄스에너지 등을 계산하는 프로그램을 완성했다.

2022.06.07
피크분석으로 펄스당 방전에너지라던가 전자밀도 등을 계산하도록 개선했다

728x90

관련글 더보기