매직코드
article thumbnail

지난 포스팅에서 푸리에 변환에 설명했다.

이번에는 조금 다른 진동센서 데이터를 가지고 조금 다은 푸리에 변환을 해보려고 한다.

지난번 푸리에 변환에 대한 코드와 설명을 보고싶다면 아래 포스팅으로...

누수감지를 위한 진동센서 데이터 신호처리 및 누수 예측 (푸리에변환 FFT)

 

누수감지를 위한 진동센서 데이터 신호처리 및 누수 예측 (푸리에변환 FFT)

목표 : 누수감지를 위해 설치된 진동센서로부터 기록되는 진동데이터를 통해 정상인 상태와 누수가 진행되는 상태를 예측 방법 : 진동센서 데이터를 이용해 시간 영역 특징 추출과 주파수 변환

magicode.tistory.com

 

목표 : 진동센서 데이터를 통해 기계 고장 유형 분류

방법 : 시간 영역 특징 추출과 주파수 변환(fft) 및 하모닉 확인을 통한 고장 유형 분류 모델 생성

 

1. 진동 센서 데이터 확인

 

기계가 고장나면 고장 유형에 따라 진동이 다르게 나타난다.

본 프로젝트에서는 진동의 서로 다른 패턴을 주파수로 변환하여 어떤 하모닉에서 어떤 고장 유형을 보이는이 예측한다.

 

하모닉(harmonic)이란 한국말로는 '고조파' (고주파 아님)라고 부르며 원천 주파수의 배수 주파수 성분을 말한다.

단위는 hz(헤르츠)이고, 원천 주파수가 10hz라면 2x (하모닉2)는 20hz, 3x (하모닉3)은 30hz로 단순하게 배수관계라고 생각해도 된다.

자세한 설명은 아래 포스팅을 참조하면 좋을 것 같다.

http://www.rfdh.com/bas_rf/begin/harmonic.htm

 

이번에 사용한 진동센서는 1초에 4000번 측정되는데 한 번 측정할 때 마다 3초씩 측정했다.

푸리에 변환을 적용한 데이터들은 6000개의 컬럼으로 들어갔기 때문에 최종 데이터 크기는 10000 row x 6013 columns 다.

 

2. 주파수 영역 특징 추출

 

시간 영역 특징은 지난번과 동일하게 적용할 예정이기 때문에 시간영역 특징이 위에 링크된 포스팅에서 확인하면 좋을 것 같다.

 

이번 진동센서 역시 위와 같은 형태로 데이터가 들어왔다.

이 데이터를 가지고 푸리에 변환을 시도해본다.

 

duration = 3 # 3초
sample_rate = 4000 # 1초에 4000번 측정
n = sample_rate * duration # 총 측정 데이터

# x축
xf = np.fft.rfftfreq(n, 1/sample_rate)

# y축
yf = np.fft.rfft(data, norm='ortho') # data는 원본데이터, norm은 정규화 파라미터
yf = np.abs(yf)
yf = pd.DataFrame(yf) # 이후 join을 해주기 위해 데이터프레임 형식으로 변환했는데 사용방법에 따라 array로 해도 됨
yf = yf.T

 

x축은 fft에서 제공하는 ffrfreq로 쉽게 계산해준다.

y축은 말 그대로 fft 변환을 했다.

 

fft 변환을 해보니 위와 같은 그래프가 나왔다.

몇몇 값들이 튀는 걸 보면 고장 유형에 따라 튀는 값이 어떻게 다른지 비교를 통해 분류할 수 있어보인다.

 

3. 하모닉 찾기

솔직히 하모닉 개념은 이해했는데 코드로 어떻게 찾아야하는지 아직 잘 모르겠다.

일단 노가다를 좀 뛰어봤다.

 

하모닉을 찾으려면 조건이 있는데 RPM을 알아야 한다는 것이다.

RPM은 1분동안 회전한 수 인데 이걸 주파수랑 맞춰줘야 한다.

 

예를 들어 RPM이 600인 진동센서가 있다고 하면 1분에 600번 회전한다는 의미다.

그렇다면 1초에는 몇 번 회전할까??

1분은 60초니깐 60을 나누면 1초에 10번 회전한다.

이 말은 진동센서의 고유 주파수가 10hz 라는 것과 동일하다.

 

내가 가지고 있는 데이터는 1730 ~ 1770RPM이다.

그렇다면 이 진동센서의 고유 주파수는 28.83 ~ 29.5hz다.

이 데이터의 평균 주파수인 29hz를 기준으로 1x, 2x, 3x, 4x 까지만 뽑아봤다.

이 데이터는 1초에 2000개씩 총 6000컬럼이 있으니 206x 까지 뽑을 수 있다.

 

# 데이터 프레임 만들기
df_harmonic = pd.DataFrame()

# 라벨 값 복사 (모델 학습을 위함)
df_harmonic['Label_No'] = df['Label_no']

# 하모닉 값 구하기
df_harmonic['1x'] = df.iloc[:, 25:35].T.max()
df_harmonic['2x'] = df.iloc[:, 55:65].T.max()
df_harmonic['3x'] = df.iloc[:, 85:95].T.max()
df_harmonic['4x'] = df.iloc[:, 115:125].T.max()

 

뭔가 좀 더 좋은 수가 있을 것 같은데 일단은 컬럼의 위치로 하모닉 값을 뽑았다.

29hz의 배수가 되는 지점에서 오차범위를 좀 생각해서 25~35hz사이의 가장 큰 값을 구했다.

 

 

4. 모델 생성

지난번에는 이진 분류 모델이었는데 이번에는 고장 유형 분류로 다중 분류 모델을 만들게 되었다.

정상 0 값과 더불어 고장 원인에 따라 1, 2, 3, 4로 분류되는 데이터다.

분류 모델로는 Logistic Regression, SVM, KNN, Decision Tree, Random Forest, XGB Classifier, LGBM Classifier를 사용했다.

 

지난번과 동일하게 fft 변환만 하고 하모닉을 적용하지 않은 경우에는 아래와 같이 정확도가 나왔다.

하모닉을 적용하지 않은 모델

 

하모닉을 적용한 경우에는 아래와 같은 성능 평가 결과가 나왔다.

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!