Machbase Neoで実現するリアルタイム高速フーリエ変換(FFT)
Machbaseリアルタイムデータ研究所
はじめに
本記事では、時系列データベース(Time-Series DBMS)の性能を生かした、高速フーリエ変換の活用方法を紹介します。Machbase Neoのサンプルを使って、以下の実習を行えます。サンプルは用途に合わせて変更でき、手軽に高速な分析を試せます。
本記事を通して、次のことを実践できます。
各軸を毎秒1,000サンプルで取得する、3軸の振動データを同時にリアルタイム表示する。
追加のプログラミングなしで、各軸の高速フーリエ変換(FFT)の結果をリアルタイムに可視化する。
追加のプログラミングなしで、振動データのPeak、RMS、Troughを計算し、時間的な推移を可視化する。
Machbase Neoに蓄積した数十億件の振動データから、センサー、時間、分析条件を指定して、FFTの結果を高速に取得する。
動作を先に確認したい方は、デモ動画をご覧ください。実習手順は以下のセクションで説明します。
フーリエ変換とは
初めての方には、次の図が分かりやすいでしょう。

左側にある音声や振動などの時間波形について、どの周波数成分が含まれているかを、周波数を横軸にして確認できる方法と考えると分かりやすくなります。高速フーリエ変換は、この計算を効率よく行うアルゴリズムです。
高速フーリエ変換(FFT)の用途
先ほどの動画で「史上最も重要なアルゴリズム」と紹介されるように、FFTは幅広いデータ分析で利用されています。
通信:デジタル信号処理、データ圧縮、誤り検出・訂正、信号の変調・復調。
音響技術:音声のスペクトル分析、音質改善、ノイズ除去。
画像・映像処理:フィルタリング、圧縮、画質改善、パターン認識。
レーダー・衛星:レーダー信号の処理・解釈、衛星データのスペクトル分析。
医療画像:MRIやCTなどの画像データ処理。
金融分析:時系列データの周期性などの分析。
地球物理・探査:地震波の分析や資源探査。
科学研究:物理、化学、工学などにおける実験データの分析。
音声認識:音声信号の特徴の分析と認識。
実務でFFTを活用する際の課題
これほど有用なアルゴリズムがあるなら、あらゆる産業で問題なく活用できそうです。では、どこに課題があるのでしょうか。本記事で扱うのは、FFTアルゴリズム自体の改良や開発ではありません。
実際の課題は、FFTの対象となるデータの規模と活用方法です。各業界では以前からリアルタイムFFTが使われ、分析・可視化ツールも発展してきました。
しかし、分析した「データ」はどこに残っているのでしょうか。
これは実務上の大きな問題です。先ほどの用途の基礎となる音声や振動データは、高頻度で収集されます。振動では、500Hz程度から最大100kHz、つまり毎秒10万件に達することもあります。こうしたセンサーが複数ある現場では、専用機器で30秒から1分程度を分析できても、次の要望への対応が課題になります。
FFTを継続的に分析したい。一日に数分だけの測定では、十分な精度が得られるとは限らない。
過去のデータを、後から任意の条件でFFT分析したい。
FFTに加えてPeakやRMS(二乗平均平方根)もリアルタイム表示し、アラートを設定したい。
蓄積したデータをAI学習に利用したい。余分なコーディングや高コストな形式変換をせず、必要なデータを取り出したい。
流入する生の振動データとFFT結果を、リアルタイムのAI推論入力として使いたい。
顧客の要望が高度化し、新技術による改善が求められる産業現場では、こうした壁に直面します。
時系列データベースとFFTの組み合わせ
「Born to be a rockstar!」という言葉になぞらえるなら、時系列データベースはFFTのために生まれたと言いたくなるほど、相性のよい技術です。

FFTの対象となる振動・音響データは、毎秒数千~数十万件の速度で到着します。リアルタイム分析には、毎秒100万件以上を取り出す性能が求められることもあり、一日に数億件を超えるデータが蓄積されます。
こうしたデータの管理に適した技術が、時系列データベースです。以前は、FFTを行う産業現場でも、分析後のデータを保存せずに捨てることが多くありました。そこからも、管理の難しさが分かります。
振動を扱う研究や産業の現場では、「生の振動データは保存する必要がない」「生データには価値がない」といった見方もあります。しかし、その背景には、膨大なデータを集め、リアルタイムに活用することの難しさがあります。
一方、新しい世代の技術者からは「データを捨て続けるのはなぜか。保存して分析できないのか」という声も上がり、その価値や活用の可能性が検討されています。
本記事では、高頻度で生成される音声・振動データを、時系列データベース上でリアルタイム分析する例を示します。HTML内の数行のJavaScriptを除き、独自のプログラミングを加えず、Machbase Neoの機能で構成した例です。
リアルタイムFFTを試す
0. まず動作を見たい方へ
以下の実習では、Machbase Neoをインストールし、用意されたスクリプトでX・Y・Z各軸に毎秒1,000件の振動サンプルを生成します。FFT、Peak、RMSなどをリアルタイム表示し、蓄積された大量のデータから時間やセンサーを指定して分析する方法を試します。
技術的な手順のすべてを追う必要がない方や、企画・管理部門向けに、約5分の動画も用意しています。
1. Machbase Neoをインストールする(8.0.17を使用)
Machbase Neoのインストール方法は、各種ドキュメントで紹介されています。
インストール動画を見ながら進めることも、インストールドキュメントを参照することもできます。

ブラウザーから上の画面に接続し、初期ユーザー名sys、パスワードmanagerでログインします。
2. neo-appsをダウンロードする
Neoには、GitHubのソースコードを内部へ直接取り込む機能があります。ここでは、Neoがインストールされ、起動しているものとします。
左上の三つ目のアイコンをクリックすると、中央にGit Cloneメニューが表示されます。 https://github.com/machbase/neo-apps.git を入力してOKをクリックすると、アプリが取り込まれます。

完了すると、最上位にneo-appsディレクトリが作成されます。その中のrealtime-fftを開くと、実習に必要なソースコードが表示されます。

3. データスキーマと取り込みを準備する
FFTテーブル用のセンサー構成
このデモは、1台の3軸振動センサーを想定したシミュレーションです。違いが分かりやすいよう、各軸に複数の波形パターンを設定しています。X・Y・Zそれぞれに毎秒1,000件を生成し、内部タイマーが取り込み用TQLを毎秒1回呼び出します。データベース全体では、毎秒3,000件が入力されます。
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:Z軸。0.5Hz・振幅20、15Hz・振幅10、35Hz・振幅3、220Hz・振幅2、400Hz・振幅2。
付属のrealtime-fft.wrkを開くと、作成するスキーマと、Neoのシェルで実行するタイマー登録スクリプトがあります。順に実行すれば、取り込みの準備が整います。
FFTテーブルの作成

保存期間(Retention)の設定
毎秒3,000件のデータを無制限に保存すると、ディスク容量を使い切り、サービスに影響します。RETENTION機能では、タグテーブルの保存期間を指定し、それを過ぎたデータを削除して、容量を管理します。
このデモでは、1か月分を保持し、毎日1回、期限を過ぎたデータを削除するポリシーを設定します。
CREATE RETENTION policy_1m_1d DURATION 1 MONTH INTERVAL 1 DAY;
ALTER TABLE fft ADD RETENTION policy_1m_1d;4. タイマーを作成する
タイマースクリプトをコピーする

シェルでタイマースクリプトを実行する
シェルを開き、コピーした内容を貼り付けます。タイマーが起動すると、FFTテーブルに毎秒合計3,000件の振動データが入力されます。

上の例では、すでに合計3,000万件が入力されています。
取り込み用TQLの概要
insert-auto-fft-x.tqlのソースを見てみましょう。タイマーによって毎秒1回呼び出され、1,000件のデータを生成してMachbaseに入力します。
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秒間の波形を1,000件生成し、random()でノイズを加えます。その後、タグ名vib-xを設定し、APPENDでfftタグテーブルへ高速に取り込みます。
5. 生データのリアルタイムダッシュボードを見る
各軸に入力されている直近1秒間のデータを、ダッシュボードで確認します。realtime-fft.dshが用意されているため、クリックするとリアルタイム表示が開きます。必要に応じて、チャートのオプションも変更してみてください。

実際の振動波形は、これほど多彩ではありません。X軸が比較的実際の波形に近く、ほかの軸はデモで違いが分かりやすいように構成しています。
6. リアルタイムFFTを分析する(realtime-fft.html)
realtime-fft.htmlを開き、ソースコード上部の矢印をクリックします。内蔵Webサーバーがページを配信し、ブラウザーに表示します。

ブラウザーには、次の画面が表示されます。

画面は、次のように構成されています。
X・Y・Zの各軸について、現在から過去1秒間のデータをFFT分析し、2Dでリアルタイム表示します。
各軸について、現在から過去10秒間のデータをFFT分析し、3Dでリアルタイム表示します。
合計六つのFFT分析をリアルタイムに行っています。負荷の高い環境も考慮し、更新間隔は10秒にしていますが、用途に合わせて調整できます。
ここから、さらに分析を広げてみましょう。
7. オプションを指定して3D FFTを分析する(custom-fft.html)
同じ方法でcustom-fft.htmlを開くと、次の画面が表示されます。さまざまなオプションを指定してFFT分析を行えます。

AXIS:X・Y・Zの軸を選択します。
分析時間:現在から何秒前までを対象とするかを指定します。最大60秒です。
分析精度:分析単位を50~1,000msで調整できます。
最小・最大周波数:表示する周波数の範囲を指定します。
テーマ:可視化のテーマを選択します。
この画面では任意の過去日時を指定できません。その機能は、NeoのTag Analyzerでより柔軟に利用できるため、このサンプルには別途実装していません。次の節で確認しましょう。
8. Tag AnalyzerでFFTを分析する(realtime-fft.taz)
Machbase NeoのTag Analyzerは、指定したタグの可視化に加えて、FFT分析にも対応しています。
付属のrealtime-fft.tazを開くと、各軸の最新データが次のように表示されます。

左上の赤枠:クリックすると、最新データでチャートを更新します。
右上の赤枠:クリックすると、データ範囲を選択するモードに切り替わります。
対象範囲を選択し、表示されたチャート型アイコンをクリックすると、FFTを実行して結果を可視化します。

分析ボタンを押すと、次のポップアップが表示されます。

下部のスライダーで表示範囲を拡大・縮小できます。右上の2Dをクリックして3Dに切り替え、その横の再生ボタンを押すと、3D表示になります。intervalで分析の時間解像度を調整でき、初期値は100msです。

intervalを変更して赤い再生ボタンを押すと、新しい解像度でFFT結果を更新します。
9. リアルタイム統計を分析する(realtime-data.html)
realtime-data.htmlを開いて実行すると、次の画面が表示されます。FFT以外の統計関数を使い、振動データをリアルタイム分析するサンプルです。
上段の三つのチャートは、X・Y・Z各軸の1秒分の生データを表示し、3秒ごとに更新します。下段の三つは、直近10秒間のデータを2秒単位にまとめ、各軸のPeak、RMS、Troughの推移を表示します。

各統計値の意味は次の通りです。
Peak:対象の2秒間における振幅の最大値。
Trough:対象の2秒間における振幅の最小値。
RMS:対象の2秒間における二乗平均平方根。振動の大きさを表します。
必要に応じて、ほかの統計値も追加できます。リアルタイム計算に使う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の軸を選択します。
分析時間範囲:現在から何秒前までを対象とするかを、2~60秒で指定します。
統計分析の間隔:1、2、3、5、10秒から選択します。
次の例では、X軸の直近30秒間を対象に、2秒ごとのPeak、RMS、Troughを表示しています。

次の例では、Y軸の直近60秒間を対象に、5秒ごとの統計値を計算して表示しています。

おわりに
このデモでは、毎秒数千件のデータが入力される中でも、時系列データベースを使ってFFTと統計分析をリアルタイムに実行できることを確認しました。幅広いハードウェアで試せるよう、データ量と分析規模を抑えています。実運用では、適切なハードウェアを用意することで、毎秒数万~数十万件の入力や、より大規模な分析にも対応できると考えています。
Machbase Neoでは、大量のデータが発生する環境でも、リアルタイム分析を行えます。また、そのためにデータを必ず捨てたり、別形式へ変換したりする必要がないことも、本記事を通してお伝えできれば幸いです。
ご質問やご要望がありましたら、下のリンクからMachbaseの情報をご確認のうえ、お問い合わせください。
続編のご案内
続編の【FFTシリーズ第2回】リアルタイムFFTとアラートシステムの構築も、ぜひご覧ください。



