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

진동센서 데이터의 노이즈 제거를 위한 간단 코드

by 독학박사 2023. 1. 20.

목차


     현장에서 얻어진 진동센서의 데이터에는 실제 측정하려는 진동 이외의 주변 노이즈에 의한 진동도 섞여 있는 경우가 대부분입니다. 이는 이상치 제거와는 달리 신호처리를 통해 제거해야 합니다. 진동데이터의 노이즈를 제거해야 하는 이유는 FFT 분석을 함에 있어 더욱 정확한 변환을 위함입니다. 오늘은 Python의 내장 scipy 라이브러리를 사용하여 진동 데이터에서 노이즈를 제거하는 방법에 대한 간단한 예를 보임으로써 설명을 드리려고 합니다.

     

     

    파이썬 노이즈 필터링
    파이썬 노이즈 필터링

     

    1. 진동데이터 및 노이즈 합성

     샘플링타임(fs)을 1000Hz로 하는 진동데이터를 만들겠습니다. 데이터의 개수는 fs의 수치를 이용하였습니다. 신호의 주기(Hz)는 10으로 하였습니다. 샘플링 타임은 진동센서가 1초에 수집하는 데이터 개수를 의미하며 신호의 주기는 발생되는 신호가 1초에 몇 번 반복되는가입니다. 노이즈의 크기는 0.1로 하여 1000개를 만들고 데이터에 더해 주었습니다.

     

    #%%
    import numpy as np
    from scipy import signal
    import matplotlib.pyplot as plt
    import matplotlib
    
    matplotlib.use('tkagg')
    #%%
    # Generate some sample vibration data
    fs = 1000  # Sample rate (Hz)
    t = np.linspace(0, 1, fs, endpoint=False)  # Time vector
    f = 10  # Frequency of the signal (Hz)
    data = np.sin(2 * np.pi * f * t)
    #%%
    # Add some random noise to the data
    noise = 0.1 * np.random.randn(fs)
    noise_data = data + noise
    #%%

     

    노이즈데이터 그래프
    노이즈데이터 그래프

     

    2. Low-pass Butterworth filter 설계

     노이즈 데이터는 low-pass Butterworth filter를 적용하여 제거합니다. 필터 설계 및 노이즈 제거 방법은 아래 코드를 참고하시기 바랍니다. 

     

    # Design a low-pass Butterworth filter
    nyquist = 0.5 * fs
    cutoff = 15  # Cutoff frequency (Hz)
    normal_cutoff = cutoff / nyquist
    b, a = signal.butter(4, normal_cutoff, btype='low', analog=False)
    
    # Apply the filter to the data
    filtered_data = signal.filtfilt(b, a, noise_data)

     

     

    필터링 데이터 그래프
    필터링 데이터 그래프

     

     

    scipy 라이브러리의 signal.butter() 함수는 Butterworth 필터를 설계하는 데 사용됩니다. 이 함수에서 다음 네 가지 인수를 사용했습니다. signal.butter() 함수는 필터의 분자 및 분모 계수를 반환하며, 이는 signal.filtfilt() 함수를 사용하여 데이터에 필터를 적용하는 데 사용할 수 있습니다.

     

    4: 이것은 필터의 주파수 응답에서 롤오프의 가파른 정도를 결정하는 필터 차수입니다. 필터 차수가 높을수록 롤오프가 더 가파르고 고주파 노이즈를 거부하는 능력이 더 커집니다. 이 예에서는 필터 차수 4가 사용됩니다.

    normal_cutoff: 0과 1 사이에서 정규화된 필터의 차단 주파수입니다. 차단 주파수는 필터의 이득이 통과대역 이득보다 3dB(또는 0.707) 낮은 주파수입니다. 이 예에서 컷오프 주파수는 15Hz로 설정되고 normal_cutoff는 컷오프/나이퀴스트와 같습니다. 여기서 컷오프는 15이고 나이퀴스트는 샘플 속도의 절반인 500Hz입니다.

    btype='low': 필터의 유형을 지정합니다. 저역 통과 필터는 고주파 신호를 감쇠시키면서 저주파 신호를 통과시킵니다.

    analog=False: 아날로그 또는 디지털 필터를 설계할지 여부를 지정합니다. 이 예에서는 디지털 필터가 사용되므로 analog=False입니다.

     

     

    3. Cutoff와 Nyquist의 의미

    차단 주파수(cutoff)는 필터의 이득이 통과대역 이득보다 3dB(또는 0.707) 낮은 주파수, 즉 필터가 입력 신호의 진폭을 줄이기 시작하는 주파수입니다. 필터 전환이 발생하는 주파수, 필터가 입력 신호의 진폭을 줄이기 시작하는 지점입니다.

     

    Nyquist 주파수는 이산 시간 신호로 정확하게 표현할 수 있는 가장 높은 주파수입니다. 샘플링 속도의 절반과 같습니다. 예를 들어 샘플 속도가 초당 1000개 샘플인 경우 정확하게 표현할 수 있는 가장 높은 주파수는 500Hz(1000/2)입니다.

     

    Nyquist 주파수보다 높은 주파수는 고주파수 신호가 저주파 신호로 잘못 표현되는 현상인 앨리어싱을 초래한다는 점에 유의하는 것이 중요합니다. 따라서 앨리어싱을 방지하기 위해 다운 샘플링 전에 신호에 앤티 앨리어싱 필터를 적용하는 것이 중요합니다.

     

    이전 예에서 signal.butter(4, normal_cutoff, btype='low', analog=False)로 설계된 저역 통과 필터는 주파수가 15Hz 미만인 신호를 통과시키고 주파수가 15Hz보다 높은 신호는 거부합니다. 15Hz. 샘플링 속도가 초당 1000 샘플이므로 이산 시간 신호로 정확하게 표현할 수 있는 가장 높은 주파수가 500Hz라는 것을 알고 있기 때문에 앨리어싱을 방지하도록 설계되었습니다.

     

     

    4. 마치며

    진동센서 데이터의 노이즈 제거를 위한 간단 코드설명을 위해 노이즈가 섞인 데이터를 생성하고 로우패스 필터를 설계해 노이즈 제거까지 진행해 보았습니다. 이는 간단한 예로 실제 진동 신호의 노이즈를 제거할 때는 좀 더 고려해야 할 사항들이 많으니 이번 포스팅은 단순 참고용으로 보시기 바랍니다.