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

파이썬을 이용한 진동 데이터의 고유 진동수 계산하기

by 독학박사 2023. 1. 18.

목차


     진동데이터 분석을 통해 진동을 발생시키는 설비, 구조물 등의 많은 특성을 알아볼 수 있습니다. 오늘은 그중에서 고유 진동수를 추출하는 방법에 대해 알아보겠습니다. 파이썬을 이용하여 FFT분석을 통해 진행됩니다. 고유진동수를 확인하기 전에 고유진동수를 분석할 진동데이터를 생성하는 코드부터 설명드리겠습니다.

     

     

    고유진동수 구하기
    고유진동수 구하기

     

    1. 진동데이터 생성

    다음은 Python에서 NumPy 라이브러리를 사용하여 합성 진동 데이터를 생성하는 방법의 예입니다. 우선 코드부터 공개 후 설명하도록 하겠습니다.

     

    import numpy as np
    
    # Sample rate and duration (in seconds).
    fs = 1000.0
    duration = 1.0
    
    
    # Generate time points.
    t = np.linspace(0, duration, int(fs * duration), endpoint=False)
    
    # Define the natural frequency of the vibration.
    natural_frequency = 50.0
    
    # Generate synthetic vibration data.
    vibration_data = np.sin(2 * np.pi * natural_frequency * t)
    
    # Add noise to the data.
    noise = np.random.normal(0, 0.1, len(t))
    vibration_data += noise
    
    # Save the data to a file.
    np.savetxt("vibration_data.txt", vibration_data)

     

      t 변수는 진동 데이터의 지속 시간에 해당하는 시점(time point)의 배열입니다. t는 vibration_data가 y라 할 때 인풋값(x)으로 사용됩니다. 0~1초까지 총 1000개의 데이터를 만듭니다.

     

     natural_frequency 변수는 진동이 발생하는 주파수입니다. 합성 진동 데이터는 고유진동수와 시점(t)을 갖는 sin-wave를 사용하여 생성됩니다.

     

    np.random.normal() 함수를 사용하여 노이즈 데이터를 생성하고 합성 진동 데이터(vibration_data)에 추가합니다. 마지막으로 데이터는 np.savetxt()를 사용하여 "vibration_data.txt"라는 파일에 저장됩니다. 테스트를 위해 임의의 합성 데이터(vibration_data.txt)를 만들었지만 추후에는 실제 진동 센서의 데이터를 사용하시면 됩니다.

     

    진동데이터 그래프
    진동데이터 그래프

     

     

    2. 고유진동수(natural frequency) 계산

     위에서 만들어진 진동데이터가 실제 진동 센서의 데이터라 가정하고, 진동 데이터와 Python의 NumPy 및 SciPy 라이브러리를 사용하여 신호의 고유 주파수를 계산하는 코드는 아래와 같습니다.

     

     

    import numpy as np
    from scipy.fftpack import fft, fftfreq
    from scipy.signal import find_peaks
    
    # Sample rate (in Hz) and vibration data.
    fs = 1000.0
    vibration_data = np.loadtxt("vibration_data.txt")
    
    # Perform FFT on the vibration data.
    fft_data = fft(vibration_data)
    frequencies = fftfreq(len(vibration_data), 1/fs)
    
    # Find the peaks in the FFT data.
    peaks, _ = find_peaks(np.abs(fft_data))
    
    # Filter the peaks to only include those above a certain threshold.
    threshold = np.max(np.abs(fft_data)) * 0.1
    peaks = peaks[np.abs(fft_data[peaks]) > threshold]
    
    # The natural frequency is the peak that corresponds to the highest frequency.
    natural_frequency = frequencies[peaks[np.argmax(frequencies[peaks])]]
    
    print("Natural frequency:", natural_frequency, "Hz")

     

     fs는 sampling rate로 실제 진동센서의 데이터로 분석할 경우 센서의 sampling rate 값을 넣어 주어야 합니다.  위에서 진동 데이터를 생성할 때 샘플링을 1000으로 한 것은 센서에 sampling rate를 1000으로 세팅했다는 의미입니다. 따라서 데이터를 갖고 와 분석 시 센서에 세팅된 값을 정확하게 넣어줘야 됩니다.

     

     1번 예에서 만들어진 진동데이터(vibration_data.txt)를 불러와 vibration_data에 입력합니다. scipy.fftpack.fft() 함수는 진동데이터를 frequency domain으로 변환하기 위해 FFT 수행하고 복소수를 반환하기 위해 사용했습니다. scipy 라이브러리는 터미널에서 'pip install scipy' 명령으로 추가해야 합니다.

     

     scipy.fftpack.fftfreq() 함수는 FFT 데이터의 주파수를 계산하고 scipy.signal.find_peaks() 함수로 FFT 데이터에서 피크를 찾습니다. 그런 다음 특정 임계값을 초과하는 피크만 유지하고 이 중에서 가장 높은 주파수에 해당하는 피크를 신호의 고유 주파수로 간주합니다. 1번에서 고유진동수를 50으로 설정했습니다. 고유진동수가 계산된 결과값을 보면 정확하게 50이 출력되는 것을 확인할 수 있습니다. 

     

     

    3. 마치며

    지금까지 진동 데이터에 대해 파이썬으로 신호의 고유 진동수를 찾는 방법에 대해 설명하였습니다. 신호의 특정 특성에 따라 다른 방법과 기술이 더 적절할 수 있음을 유의해야 합니다.

     

     

    댓글