top of page

마크베이스 네오를 활용한 실시간 고속 푸리에 변환 (FFT : Fast Fourier Transformation)

최종 수정일: 7월 19일

마크베이스 실시간 데이터 연구소



들어가며

이 글에서는 "시계열 데이터베이스"(Time Series DBMS)가 비교가 불가능할 정도의 성능으로 가장 강력하게 활용될 수 있는 고속 푸리에 변환을 활용하는 방법에 대해 기술해 보겠다. 또한, 실제로 마크베이스 네오에서 제공하는 샘플을 통해 다음과 같은 실습이 가능하며, 누구나 쉽게 수정하여 자신의 목적에 맞게 가장 편하고, 빠르게 활용할 수 있으리라 확신한다.


이 글을 모두 읽게 되면,

  • 실시간으로 초당 1000개의 샘플링으로 동작하는 3축의 진동 데이터를 동시에 시각화 할 수 있다.

  • 별도의 프로그래밍 없이 실시간으로 3축에 대해 각각 고속 푸리에 변환(FFT) 결과를 화면에 시각화 할 수 있다.

  • 별도의 프로그래밍 없이 실시간으로 진동 데이터의 Peak, RMS, Trough 값을 즉시 시각화하고, 트렌드를 그릴 수 있다.

  • 마크베이스 네오에 입력된 수십억건의 진동 데이터에 대해 임의의 센서, 임의의 시간, 임의의 분석 조건을 지정하여 가장 빠르게 FFT 결과를 얻을 수 있다.


만일 동작 데모를 동영상으로 빠르게 확인하고 싶을 경우 이 링크로 바로 이동하거나, 준비된 실습 링크로 바로 이동하면 된디.



푸리에 변환

이 푸리에 변환에 대한 상세한 내용은 다음의 링크를 참조하자. 그리고, 푸리에 변환에 대한 역사적 의미를 재미있게 이해하고자 한다면, 베르타시움 채널에서 "역사상 가장 중요한 알고리즘" 이라고 칭한 동영상 자료를 강력하게 추천한다. (재미있다!)


푸리에 변환이 무엇인지 초심자의 이해를 위한 가장 쉬운 그림은 아래와 같다.

위 좌측의 시계열로 나오는 음성 혹은 진동과 같은 파형을 X 축 주파수 기준으로 어떠한 대역의 파형이 포함되었는지 한눈에 알게 해 주는 알고리즘이라고 이해하면 가장 쉬울 것 같다. 고속 푸리에 변환은 이 변환 과정을 빠르게 해 주는 개선된 알고리즘이라고 알아두자.


어디에서 (고속) 푸리에 변환(FFT)을 활용할까?

앞의 동영상에서 "역사상 가장 중요한 알고리즘"이라고 불렀던 만큼 이 알고리즘의 활용은 무궁무진하며, 거의 대부분의 데이터 분석 시스템에서 활용하고 있다고 보면 된다.


  1. 통신: FFT는 디지털 신호 처리에서 중요한 역할을 하며, 데이터 압축, 오류 감지 및 수정, 신호 모듈레이션 및 디모듈레이션에 사용

  2. 오디오 및 음향 기술: 오디오 신호의 스펙트럼 분석, 음질 개선, 소음 제거 등

  3. 이미지 및 비디오 처리: FFT는 이미지 필터링, 압축, 향상 그리고 패턴 인식 등

  4. 레이다 및 위성 시스템: 레이다 신호의 처리 및 해석, 위성 데이터의 스펙트럼 분석

  5. 의료 영상: MRI, CT 스캔 등의 의료 영상 데이터를 처리

  6. 금융 분석: 시계열 데이터의 주기성 분석과 같은 금융 데이터 분석

  7. 지구물리학 및 탐사: 지진학에서의 파동 분석, 자원 탐사

  8. 과학 연구: 물리학, 화학, 공학 등 다양한 과학 연구에서 실험 데이터의 분석

  9. 음성 인식: 음성 신호의 특성을 분석/인식 활용


현업에서의 고속 푸리에 변환(FFT) 활용 문제

이렇게 좋은 알고리즘이 이미 있다면, 이미 모든 산업 분야에서 큰 어려움 없이 잘 활용하고 있을 텐데, 도대체 무슨 문제가 이곳에 있는 것일까? 위의 알고리즘에서 잠시 언급을 했었지만, 알고리즘 자체는 이미 완성된 자체이므로 이를 더 개선하거나, 개발하는 문제는 이 영역에 포함되어 있지 않다.


예상하고 있을지 모르지만, 실제 문제는 FFT를 수행하는 데이터의 규모와 활용에 있다. 오래전부터 해당 산업군에서는 실시간으로 FFT를 분석해 오고 있었고, 다양한 도구와 시각화 툴을 통해서 누구나 쉽게 데이터를 분석할 수 있는 수준으로 발전해왔다.


그러나, 문제는 그 분석을 한 "데이터"가 어디에 있느냐이다.


웃기는 질문이라고 생각할 수 있지만, 현업에서는 매우 큰 문제로 대두되기 시작했다. 앞의 활용 예를 잠깐 살펴보면, 가장 기초적인 데이터는 음향 데이터 혹은 진동 데이터이다. 일반적으로 진동 데이터의 경우 아무리 낮아도 500Hz 정도에서 시작해서, 최대 100KHz 까지 데이터를 수집할 수 있다. 다시 말해 초당 10만건의 데이터가 발생하는 센서를 여럿 장착하고 있는 현장에서 FFT 분석은 그나마 최적화된 전용장비를 통해 잠시(30초에서 1분) 분석할 수 있지만 이 자체만으로는 다음과 같은 요구사항은 어떻게 해결해야 할까?


  • 나는 연속적으로 FFT를 분석하고 싶다. 하루에 잠깐 몇 분 분석하는 것의 정확도를 믿을 수 없다.

  • 나는 나중에 과거의 데이터를 기반으로 내가 원하는 조건으로 FFT 분석을 하고 싶다.

  • 나는 실시간으로 이 FFT 뿐만 아니라, Peak, RMS(root mean square) 등의 분석 결과를 화면에 시각화하고, 실시간 알람도 설정하고 싶다.

  • 나는 나중에 이 데이터를 AI의 학습 데이터로 활용하고 싶고, 학습시 별도의 코딩 없이 원하는 데이터를 추출하고, 학습하고 싶다. 데이터 변환에 들어가는 비용이 너무 크다.

  • 나는 실시간으로 입력되는 진동 데이터를 날(raw) 것 그대로 그리고 FFT의 변환 결과를 AI 추론을 위한 입력으로 활용하고 싶다. 실시간으로!


세상이 변하고, 고객의 요구 사항도 높아지고, 신기술을 통해 도약을 해야 하는 실제 산업분야에서 위와 같은 해결하기 힘든 장벽을 만나는 것이 현실이다.


시계열 데이터베이스와 FFT와의 환상적인 만남


"Born to be a rockstar!" 이라는 용어처럼 FFT를 위해 "시계열 데이터베이스"가 태어났다고 해도 과언이 아닐 만큼 양쪽의 기술은 찰떡궁합이다.

그 이유는 FFT가 대상으로 하는 진동, 음향 데이터의 입력 속도는 초당 수천, 수만에서 수십만건에 달할 뿐만 아니라, 실시간 분석을 위해 추출 성능도 초당 100만건 이상의 성능이 뒷받침되어야 하기 때문이며, 이러한 데이터가 모이게 되면, 하루에 수억건의 데이터도 쉽게 넘어가기 때문이다.


이 문제를 완벽하게 해결한 데이터베이스가 바로 "시계열 데이터베이스"인데, 이 기술이 나오기 전 FFT 연산이 필요한 산업계에서 대부분의 경우 데이터를 저장하지 않고, 버렸다는 것을 상기해 보면, 이 데이터 문제가 얼마나 심각했을지 상상할 수 있다.


그래서, 진동/학술 및 산업 분야에서는 "원시 진동 데이터는 저장할 필요가 없다" 라던가, "원시 진동 데이터는 쓰레기다" 라는 밈이 널리 퍼져 있다. 그러나, 이는 "달나라에 가 봤자 아무런 소용이 없다"라거나, "저 포도는 신포도야"라고 하는 말과 동치이다. 왜냐하면, 그 방대한 데이터를 제대로 모으고, 이를 실시간으로 활용하기 매우 어렵기 때문이다.


그렇지만, 새로운 기술 세대의 현업들은 "응? 데이터를 계속 버리고 있다고? 왜? 이거 모아서 좀 분석하고 싶은데..이건 불가능한가?" 라는 말을 자주 하고 있으며, 오늘 현재도 이 데이터의 유용성과 분석 가능성에 대해 깊이 고민하고 있다.


그래서, 이 글에서는 실제 고주파로 발생하는 음성 혹은 진동 데이터를 시계열 데이터베이스라는 강력한 데이터 인프라 위에서 다양한 실시간 분석을 수행하는 실제 예를 보여주고자 작성되었다. 참고로 이 예제들은 HTML 문서 내부에 존재하는 몇 줄의 javascript 를 제외한 어떠한 코딩도 포함되지 않았으며, 마크베이스 네오의 순수한 기능을 기반으로 작성된 것을 다시 한번 강조하고자 한다.


실시간 FFT 분석 실습해 보기


0. 맘이 급하신 분들을 위한 유튜브 영상

다음 섹션의 글은 실제 개발자들이 직접 마크베이스 네오를 설치하고, 준비된 스트립트를 통해 각각 초당 1000개의 샘플을 생성하는 진동 센서의 X, Y, Z 축의 데이터를 간단하게 발생시키고, 이에 대해 실시간으로 FFT변환, Peak, RMS 등의 실시간 통계치 시각화 혹은 수집된 수천억건의 데이터를 대상으로 원하는 시간의 원하는 센서에 대해 세밀하게 FFT를 수행시켜 보는 실습 내용이다.

한편, 이 기술 내용을 모두 따라갈 필요가 없는 상위 임원분들과 기획조직을 위해 아래의 약 5분의 동영상을 준비하였으니, 빠르게 확인하시라.



1. 마크베이스 네오 설치 (8.0.17 기준)

마크베이스 설치는 다양한 문서에 있고, 매우 쉽다.

동영상 자료는 이 링크를 통해 쉽게 설치를 따라 할 수 있으며, 문서는 이 링크를 활용하자.

웹 브라우저를 통해 위와 같이 접속하고, 초기 아이디인 sys 및 패스워드 manager 를 통해 로그인하자.


2. 네오에 neo-apps 코드 다운로드

네오에서는 github의 소스코드를 직접 내부에 다운로드 받을 수 있는 방법을 제공한다. 따라서, 아래의 그림과 같이 신속하게 즉시 설치할 수 있다. 우선 네오 최신 버전이 설치되어 동작하고 있다고 가정한다.

아래의 좌윽 상단의 세번째 아이콘을 누르면, 중앙의 Git Clone 메뉴가 나타나는데, 여기에서 해당 소스코드 주소 https://github.com/machbase/neo-apps.git 를 입력하고, OK를 누르면, 자동으로 해당 앱이 설치가 된다.

neo-apps 다운로드 화면
neo-apps 다운로드 화면

설치가 완료되면, 아래의 그림과 같이 neo-apps라는 최상위 디렉토리가 생기고, 하위에 realtime-fft 이라는 디렉토리를 클릭하면, 아래와 같이 필요한 소스코드를 볼 수 있다.

3. 데이터 스키마 및 데이터 입력 타이머 수행하기

테이블 FFT 센서 구성

이 데모를 위해 실제 진동 센서 데이터를 시뮬레이션 하도록 하였으며, 데모의 효과를 극대화하기 위해 다양한 패턴을 그릴 수 있도록 조작하였다. X, Y, Z 축을 가진 1개의 진동 센서를 가정하였으며, 각각 초당 1000개의 데이터를 생성하도록 하였다. 이 생성은 마크베이스 네오의 입력 TQL을 준비하고, 내부 타이머를 이용하여 1초 각각 1회씩 호출하여, 각각 초당 1000건의 데이터를 입력하여, 데이터베이스 입장에서는 초당 3000건의 센서 데이터가 고속으로 입력된다.

  • insert-auto-fft-x.tql (X 축 진동 데이터, 150Hz의 진폭 2.0 + 300Hz의 진폭 50)

  • insert-auto-fft-y.tql (Y 축 진동 데이터, 100Hz의 진폭 1.0 + 0.1Hz의 진폭 10)

  • insert-auto-fft-z.tql (X 축 진동 데이터, 0.5Hz의 진폭 20 + 15Hz의 진폭 10 + 35Hz의 진폭 3 + 220Hz의 진폭 2 + 400Hz의 진폭 2)


제공되는 워크쉬트 화일인 realtime-fft.wrk를 열면 생성을 해야 하는 스키마 및 네오 쉘에서 수행해서 등록하는 타이머 스크립트가 있으므로 각각 수행하도록 하자. 그러면, 모든 데이터 입력을 위한 준비 작업은 완료된 것이다.

테이블 FFT 생성
저장 기간(Retention) 추가

데이터가 초당 3천건씩 무제한으로 입력될 경우 디스크 Full이 발생하면, 서비스에 문제가 발생한다. 이를 위해 마크베이스에서는 RETENTION이라는 기능을 제공하는데, 이는 대상 Tag table에 대해 데이터를 보관할 기간을 지정하고, 이를 넘는 데이터 대해서는 삭제하여 저장공간을 일정하게 유지한다.

이 데모에서는 1달간의 데이터를 저장하고, 매일 한번씩 시간이 지난 오랜 데이터를 지우는 정책을 아래와 같이 적용하였다.

CREATE RETENTION policy_1m_1d DURATION 1 MONTH INTERVAL 1 DAY;
ALTER TABLE fft ADD RETENTION policy_1m_1d;

RETENTION에 대한 자세한 내용은 해당 매뉴얼을 참조한다. (한글, 영문)


4. 타이머 생성

타이머 스크립트 복사

타이머 스크립트 쉘에서 실행

쉘 윈도우를 생성한 후에 위에서 복사한 내용을 붙여넣기 하면, 아래와 같이 타이머가 실행되며, 초당 총 3000건의 진동 데이터가 FFT 테이블로 입력된다.

위의 예제에서는 현재까지 총 3천만건의 데이터가 입력된 것을 볼 수 있다.


입력 TQL의 간단한 설명

input-auto-fft-x.tql의 소스코드를 살펴보자. 이 코드는 타이머에 의해 1초마다 한번씩 호출되고, 그 때 1000건의 데이터를 마크베이스로 순식간에 생성하고 입력시킨다.

FAKE( oscillator( freq(150, 2.0), freq(300, 50), range("now", "1s", "1ms") ))
MAPVALUE(1, value(1) + (random()-0.5) * 0.1 * value(1) )
PUSHVALUE(0, "vib-x", "name")
APPEND(table("fft"))

FAKE()를 통해 현재 시간부터 1초 후의 시간까지 1000개의 파형 데이터를 생성한 후에 random()으로 노이즈를 섞고, 'vib-x'라는 태그명을 지정한 후에, fft 태그 테이블로 APPEND 명령어로 초고속 데이터 입력을 수행한다.


5. 실시간 원시 데이터 대시보드 확인하기

이제 실제로 데이터가 입력되고 있는 각각의 센서에 대해 최신 1초간의 데이터를 대시보드로 출력해 보자. 이 대시보드는 이미 realtime-fft.dsh라는 화일로 생성되어 있으므로, 클릭만 하면, 아래의 실시간 시각화 화면이 출력된다. 필요하다면, 다양한 옵션으로 차트를 그려보도록 하자.

실제 센서의 진동 데이터는 위와 같이 화려하지 않지만(그나마 X축이 가장 닮았다), 데모의 목적으로 서로 구분될 수 있도록 데이터 패턴을 설계한 것을 참고하자.


6. 실시간 FFT 분석 해보기 (realtime-fft.html)

아래와 같이 realtime-fft.html을 로딩한 후에, 소스코드 상단의 화살표를 누르면, 해당 홈페이지가 내부 웨서버에 의해 호스팅이 시작되며, 브라우저에 해당 홈페이지 화면이 나타날 것이다.

웹 브라우저에서 아래와 같은 화면이 나타난다.

이 화면은 다음과 같이 구성되었다.

  • 현재 시간 기준으로 X, Y, Z 축 데이터에 대해 이전 1초간의 데이터를 FFT 분석하고, 2차원으로 실시간 시각화한다.

  • 현재 시간 기준으로 X, Y, Z 축 데이터에 대해 이전 10초간의 데이터를 FFT 분석하고, 3차원으로 실시간 시각화한다.

그러니까, 총 6개 종류의 FFT 분석이 실시간으로 이루어지고 있는 셈이다! 멋지지 않은가? 느린 시스템을 위해 업데이트 주기를 10초로 하였지만, 얼마든지 튜닝 가능하다.


그렇지만, 이제 이건 단지 작은 시작이라는 점을 명심하자!


7. 여러 옵션으로 3차원 FFT 분석 해보기 (custom-fft.html)

위와 동일하게 이제 소스코드에서 custom-fft.html 을 로딩하면, 아래의 화면이 나타난다. 이 화면은 사용자가 다양한 옵션을 지정하여, FFT 분석을 수행할 수 있도록 구성한 것이다. 옵션은 다음과 같다.


  • AXIS : X, Y, Z 축 선택

  • 분석시간 : 현재 시간 기준으로 얼마나 예전까지 FFT를 분석할 것인지 지정 (60초까지)

  • 분석정밀도 : 분석 단위를 50ms에서 1000ms까지 세밀하게 조정 가능

  • 최소/최대 주파수 : 이는 분석된 데이터의 주파수 범위를 결정

  • 테마 : 다양한 시각화 테마 옵션 지정


이 화면에서는 내가 원하는 시간을 지정할 수는 없는데, 이 기능은 추가할 수도 있지만, 마크베이스 네오가 자체적으로 제공하는 태그 분석 도구인 Tag Analyzer에서 더 강력하게 제공하므로 기능을 별도로 구현하지는 않았다. 다음 장에서 확인해 보자.


8.Tag analyzer 기반의 FFT 분석 해보기 (realtime-fft.taz)

앞에서 언급한 바와 같이 마크베이스 네오의 Tag Analyzer는 원하는 태그의 데이터를 강력하게 시각화해 줄 뿐만 아니라, FFT 분석도 함께 제공한다.


데모를 위해 realtime-fft.taz를 제공하므로 그 화일을 오픈하면, 최신 데이터에 대해 각각의 축의 실제 데이터를 화면에 아래와 같이 출력한다.

  • 좌측 상단의 붉은 박스는 클릭시 최신 데이터로 다시 차트를 그리는 기능

  • 우측 상단의 붉은 박스는 클릭시 차트에 대해 데이터 범위 선택 모드로 변환


아래 화면은 해당 데이터 범위를 선택하고, (붉은 가로선 범위) 새롭게 생겨난 아이콘(차트 모양)을 클릭하면, 실제 FFT 분석 후 그 결과를 시각화해 준다.


아래는 분석 버튼을 누르면, 생성되는 팝업 윈도우이다.

위와 같이 실제 FFT 분석 화면이 나타나고, 아래의 슬라이딩 윈도우를 통해 축소,확대가 가능하다. 마지막으로 우측 위의 2D를 누르면, 그곳이 3D로 변환이 되는데, 이때 바로 옆의 플레이 버튼을 누르면, 해당 분석 화면이 3차원으로 바뀌는 것을 확인할 수 있다. 이때 interval 값을 지정하며, 분석해상도를 조정할 수 있다. (default는 100ms이다)


위와 같이 3차원의 분석 화면이 출력되며, interval을 수정후 우측 붉은 색의 플레이 버튼을 누르면, 해상도를 조정한 FFT 분석 화면으로 업데이트 된다.


9. 실시간 통계 분석 해보기 (realtime-data.html)

이제 realtime-data.html을 오픈하고, 실행하면, 아래와 같은 화면이 나타난다. 이 홈페이지는 실제 진동 데이터를 실시간으로 분석하는 경우 FFT를 제외한 다른 통계 함수를 계산하는 예제를 간단하게 나타낸 것이다.


윗쪽의 3개는 1초간의 모든 데이터를 각 X, Y, Z 축의 원시 데이터를 출력하였다. (화면은 3초마다 갱신된다) 그리고, 아래의 3개의 차트는 각 축의 데이터를 대상으로 현재부터 과거 10초간의 실시간 통계 값을 대상으로 매 2초 간격으로 총 3개의 통계 종류(Peak, RMS, Trough)에 대해 시간 챠트로 나타낸 것이다.

이 실시간 통계값은 다음과 같은 의미를 가진다.

  • Peak : 해당 2초간 최대 값을 가지는 진폭 실수값 (최대 값)

  • Trough : 해당 2초간 최소 값을 가지는 진폭 실수값 (최소 값)

  • RMS : 해당 2초간 Root Mean Square를 계산한 값 (진동의 크기)


만일 필요하다면, 더 많은 통계 값을 추가할 수 있으며, 이 값을 실시간으로 계산하는 TQL은 아래와 같이 참고하도록 하자

realtime-data-stat.tql
SQL_SELECT(
    'time', 'value',
    from('fft', param('axis') ?? 'vib-x'),
    between(strSprintf('now-%s', param('range') ?? '10s') , 'now')
)
GROUP(
    by( value(0),
        timewindow(time(strSprintf('now-%s', param('range') ?? '10s')), time('now'), period(param('precision') ?? "2s")),
        "TIME"
    ),
    max( value(1),
          "PEAK"
    ),
    rms( value(1),
          "RMS"
    ),
    min( value(1),
          "TROUGH"
    )
    
)
MAPVALUE(0, strTime(value(0), 'DEFAULT', tz('Local')))
CHART(  ....생략...)

10. 여러 옵션으로 통계 분석 해보기 (custom-data.html)

자 이제 준비된 마지막 custom-data.html 분석 화면이다. 이 화면은 사용자가 다양한 옵션을 통해 최신 데이터를 통계 분석할 수 있도록 준비되었다.

이 화면의 좌측은 실제 센서의 원시 데이터를 나타내고, 우측의 분석 차트는 의미한다. 다음과 같은 옵션을 지정할 수 있다.

  • 태그 종류 : X, Y, Z 축

  • 분석 시간 범위 : 현재부터 이전 XX 초 까지 (2초부터 최대 60초)

  • 통계 분석 간격 : 1, 2, 3, 5, 10초

아래는 X축에 대해 최근 30초간의 모든 데이터에 대해 2초 간격으로 Peak, RMS, Trough 를 출력하도록 한 화면이다.

아래는 Y축에 대해 이전 60초의 모든 데이터에 대해 5초 간격으로 각종 통계를 계산하고, 시각화한 화면이다.

마치면서


시계열 데이터베이스를 기반으로 초당 몇 천 건의 데이터가 입력되는 상황에서도 실시간으로 다양한 FFT 및 통계 분석이 가능하다는 사실을 간단한 데모를 통해 검증해 보았다. 다양한 사용자들의 최적 하드웨어 사양을 고려하여, 데이터의 량이나 분석의 규모를 최소화하기는 하였지만, 실제 활용하는 경우에는 초당 수만에서 수십만건의 데이터의 입력과 대규모의 데이터 분석도 추가적인 HW의 지원을 통해 충분히 가능하다고 확신한다.


또한, 마크베이스 네오를 통해 대량의 데이터가 발생하는 환경에서도 실시간으로 데이터를 분석할 수 있게 되었고, 더구나 관련 데이터를 굳이 지우거나 변환을 할 필요도 없다는 사실이 널리 알려질 수 있다면 더할 나위가 없을 듯 하다.


혹여 관련되어 더 궁금한 점이나 필요한 것들에 대해서는 아래의 링크를 통해 마크베이스로 연락주시면, 친절하게 대답드릴 것을 약속드리며 이 글을 마치도록 하겠다.


추가

이 글을 다 읽으신 분들은 이후의 두번째 알람 시스템 구축에 대한 자료인 [FFT 시리즈 두번째 #2] 실시간 고속 푸리에 변환과 알람 시스템 구축을 참고하시기 바란다.





조회수 230회

최근 게시물

전체 보기
bottom of page