본문 바로가기
공부 목록/IT & 프로그래밍

진동 데이터의 시간에 따른 주파수 변화 가시화하기 (plt.specgram)

by 독학박사 2023. 11. 29.

목차


    파이썬 라이브러리 중 matplotlib은 데이터 가시화를 도와주는 역할을 합니다. 데이터 셋이 있을 때 여러 가지 방식으로 그래프를 그릴 수 있게 해 주는데요. 진동 데이터의 처리와 가시화를 돕는 plt.specgram() 함수에 대해서 알아보려고 합니다.

     

    파이썬 라이브러리로 진동데이터 분석하기
    파이썬 라이브러리로 진동데이터 분석하기

     

    진동 데이터 분석을 위한 가시화 방법

    진동 데이터는 특정 주기를 갖는 여러 신호들이 혼합되어 값을 나타내는 특징이 있습니다. 이러한 데이터를 분석하기 위해 FFT(Fast Fourier Transform)을 사용해 주파수별 진폭을 확인할 수 있습니다. 그 외에도 첨도, 왜도, peak to peak 등 여러 통계 데이터를 얻어 분석하는 방법도 있습니다.

     

    일반 진동의 경우 주변 환경에 따라 그 값에 변동이 생기는데요. 이러한 변동을 한눈에 볼 수 있는 방법으로 시간에 따른 주파수 변화를 가시화하는 겁니다. 

     

    진동 데이터와 시간에 따른 주파수 변동 가시화 예시
    진동 데이터와 시간에 따른 주파수 변동 가시화 예시

     

    matplotlib 라이브러리에서는 위와 같이 진동데이터를 주파수 스팩트럼으로 변경해 주는 plt.specgram()이란 함수를 제공하고 있습니다.

     

     

    plt.specgram() 함수 정의

    해당 함수의 시그니처는 아래와 같습니다. 많은 변수들이 있지만 기본적으로 사용되는 인자로는 데이터 값을 넣어주는 'x', 주파수값을 나타내는 'Fs', 색상을 지정하는 'cmap'이 있습니다.

     

    matplotlib.pyplot.specgram(x, NFFT=256, Fs=None, Fc=None, detrend=None,
    			window=None, noverlap=None, cmap=None, xextent=None,
    			pad_to=None, sides=None, scale_by_freq=None,
    			mode=None, vmin=None, vmax=None, aspect=None,
    			origin=None, extent=None, **kwargs)

     

    기본적인 인자에 대한 설명을 정리해 봤습니다.

     

    x: 입력 데이터. 1차원 배열 또는 시퀀스.
    NFFT: FFT의 창 크기. 주파수 해상도를 결정
    Fs: 샘플링 주파수. x의 샘플링 주파수를 지정
    noverlap: 오버랩되는 데이터 포인트의 수. 이를 통해 시간 축에 따른 해상도를 향상할 수 있습니다.
    cmap: 컬러 맵. 스펙트로그램의 색상을 지정합니다.
    vmin, vmax: 컬러 스케일의 최솟값과 최댓값.

     

    plt.specgram는 특정 시간에서 갖는 진동데이터의 주파수 분석을 하는 겁니다. FFT는 진동데이터가 여러 개 있어야 가능하기 때문에 NFFT의 값으로 몇 개의 데이를 사용할 건지 결정하게 됩니다. 쉽게 말해, 통계 데이터 군의 window size 크기를 말합니다. 디폴트로 256개의 데이터를 사용하게 됩니다.

     

    noverlap은 윈도우 이동에 관련된 인자입니다. 기본적으로 NFFT의 15%로 설정됩니다. 예를 들어 NFFT가 100이고, noverlap이 none이라면 FFT는 100개의 데이터로 변환되면 다음 데이터는 15개만큼 겹쳐지게 window가 shift 되는 겁니다.

     

    NFFT와 overlap의 개념
    NFFT와 overlap의 개념

     

     

    시간에 따른 주파수 변화를 확인하는 목적

    설비 이상에 대해 연구를 하게 되면 진동센서를 종종 사용하게 됩니다. 진동데이터를 모니터링해서 어느 부품 또는 어느 위치에서 고장이 날 것인지 예측하기 위함입니다.

     

    모든 사물에는 특정 주파수들이 존재합니다. 베어링의 경우 외륜, 내륜, 볼로 구성되어 있는데 각 요소부품들은 고장 주파수들을 다르게 갖고 있습니다.

     

    진동 데이터를 주파수 변환을 하고 각 요소부품의 특정 주파수의 변동을 모니터링한다면 특정 부품의 고장을 사전에 확인할 수 있게 됩니다.

     

     

    주파수 변동을 확인하는 파이썬 예제 코드

    특정 설비에서 어떤 요소 부품의 고장 주파수가 50Hz라고 가정합니다. 장기간 사용으로 이 요소 부품이 마모가 된다면 주파수의 값이 변하게 될 겁니다. 아래 예제 코드는 이러한 가정의 데이터를 만들고 plt.specgram을 사용하여 가시화하는 내용입니다.

     

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    
    # 파라미터 설정
    fs = 1000  # 샘플링 주파수
    duration = 4  # 생성할 데이터의 전체 시간 (초)
    t = np.arange(0, duration, 1/fs)  # 시간 배열
    
    # 초기 주파수가 50 Hz인 신호 생성
    initial_frequency = 50
    signal = np.sin(2 * np.pi * initial_frequency * t)
    
    # 주파수 변경 지점 설정 (예: 5초에서 주파수를 60 Hz로 변경)
    change_point = 2  # 주파수 변경이 일어나는 시간 (초)
    final_frequency = 80  # 변경 이후의 주파수
    
    # 주파수 변경 지점 이전까지는 초기 주파수, 이후는 변경된 주파수로 설정
    signal[:int(change_point * fs)] = np.sin(2 * np.pi * initial_frequency * t[:int(change_point * fs)])
    signal[int(change_point * fs):] = np.sin(2 * np.pi * final_frequency * t[int(change_point * fs):])
    
    # 원본 데이터 시각화
    fig, ax = plt.subplots(2, 1, sharex=True)
    
    ax[0].plot(t, signal)
    ax[0].set_title('Raw Vibration Data with Frequency Change')
    ax[0].set_xlabel('Time (s)')
    ax[0].set_ylabel('Amplitude')
    plt.grid(True)
    
    # plt.specgram을 사용하여 주파수 분석 수행
    ax[1].specgram(signal, Fs=fs, cmap='viridis', NFFT=256, noverlap=128)
    ax[1].set_xlabel('Time (s)')
    ax[1].set_ylabel('Frequency (Hz)')
    ax[1].set_title('Spectrogram of Signal')
    
    plt.tight_layout()
    plt.show()

     

    plt.specgram 함수를 이용하여 아래와 같은 가시화 결과를 출력해 봤습니다. window size에 대한 통계값 변환이기 때문에 주파수가 갑자기 변경되는 것이 아니라 변경되는 주변에도 주파수 값이 튀는 것을 확인할 수 있습니다.

     

    샘플 진동데이터와 시간에 따른 주파수 변화 그래프
    샘플 진동데이터와 시간에 따른 주파수 변화 그래프

     

     

     

    마치며

    진동센서에서 얻은 데이터로 그래프를 그려보면 어떻게 해석해야 할지 감이 오지 않습니다. 진동 데이터는 여러 가지 통계 방법에 의해 평가해야 합니다. 오늘은 파이썬 라이브러리에서 제공하는 plt.specgram 함수를 이용한 시간에 따른 주파수 변동 그래프에 대해 정리해 봤습니다.