본문 바로가기
개발기록/python

[python] 주파수 신호 분석 방법론 3 - Wavelet 변환

by spectrum20 2024. 11. 26.
반응형

Wavelet Transform

  • wavelet 데이터를 밴드별로 분할시켜서 증폭시킴
  • window length를 바꿔가며 STFT를 여러번 진행하는 개념
  • 복잡한 주파수 특성을 가진 신호에 대해 다해상도 분석을 통해 주파수에 관한 정보 획득
    → 시간 분해능과 주파수 분해능을 모두 고려
    (Wevelet Mother Function을 변화시켜 주파수 해상도나 시간 해상도를 조절)

 
 
장점

  • FTF보다 적용범위가 넓음
  • 특징요소 추출 자동화 용이
  • 전처리 및 특징요소 추출 동시 수행
  • 다수 신호에 대한 일괄적인 데이터 가공에 유리

 
단점

  • 데이터 크기에 따라 추출 결과 변함
  • 추출되는 특징요소 종류 많음

 

 
 
 

python 코드

모듈 import

import pandas as pd
import numpy as np
import scipy.stats as sp

!pip install PyWavelets
import pywt

 
데이터 불러오기

Data = pd.read_csv(My_path + 'ExampleData.csv', sep=',', header=None)
Data.shape

→ (3000, 2)

시간에 따른 가속도 데이터

시각화

plt.figure(figsize=(20,6))

plt.subplot(2,1,1) # x 방향 가속도 데이터
plt.plot(Data.iloc[:,0] , Data.iloc[:,1], color='r')
plt.ylabel('Acceleration (g)',fontsize=15, color='r')
plt.legend(['Acc_x'], loc = 'upper right')
plt.grid()

plt.show()

 

 
 
 
wavelet parameter 설정
8 레벨 지정

# Wavelet options

MotherWavelet = pywt.Wavelet('haar')   # Mother wavelet (모함수) 지정
Level   = 8                            # Wavelet 분해 레벨 지정
select  = 8                            # 특징추출 영역 고주파 영역부터 개수 지정 (d1~)

 
wavelet 변환

Data_Target = Data.iloc[:,1] # 시계열 데이터 센서 종류 선택
Coefficient = pywt.wavedec(Data_Target, MotherWavelet, level=Level, axis=0)   #9번 분해

 
시각화

plt.figure(figsize=(15,20))

plt.subplot(Level+2,1,1)
plt.plot(Data.iloc[:,0], Data_Target, color='r')
plt.ylabel('Raw data')
plt.grid()

plt.subplot(Level+2,1,2)
Time_temp = np.arange( 0 , 3 + 3/(len(Coefficient[0])-1) , 3/(len(Coefficient[0])-1) )
plt.plot(Time_temp , Coefficient[0])
plt.ylabel('a %d' %(Level))
plt.grid()

plt.subplot(Level+2,1,3)
Time_temp = np.arange( 0 , 3 + 3/(len(Coefficient[0])-1) , 3/(len(Coefficient[0])-1) )
plt.plot(Time_temp , Coefficient[1])
plt.ylabel('d %d' %(Level))
plt.grid()

for k in range(2,Level+1):
    plt.subplot(Level+2,1,k+2)
    Time_temp = np.arange( 0 , 3 + 3/(len(Coefficient[k])-1) , 3/(len(Coefficient[k])-1) )
    plt.plot(Time_temp , Coefficient[k])
    plt.ylabel('d %d'%(Level+1-k))
    plt.grid()

plt.show()

 

 
 
 

반응형

댓글