FFIの更なる実用例:サウンドスペクトラム解析

spectrumサンプル(配布ソースのsample/glutディレクトリ)は,SML#のCとの相互運用性を活かし,複数のCライブラリを組み合わせてひとつのアプリケーションを構築した例である.

このプログラムは,CおよびPOSIXの標準ライブラリ関数を用いて16ビットステレオの生オーディオストリームを読み込み,GNU Scientific Libraryを利用してサウンドスペクトラムを計算し,OpenGLを用いてグラフィカルなアニメーション表示を行う.

スクリーンショット

具体的には,以下のような処理を行っている.

  1. fdopen(3)関数とfread(3)関数を用いて標準入力から符号つき16ビットステレオの生オーディオストリームを読み込む.
  2. SML#プログラムでオーディオデータを浮動小数点数の配列に変換して,窓を掛ける.
  3. GSLのFFT関数に浮動小数点数の配列を渡してフーリエ変換を行う.
  4. SML#プログラムでフーリエ変換の結果からパワースペクトラムの計算し,デシベルへ単位を変換する.
  5. パワースペクトラムをヒストグラムとして描画するための浮動小数点計算を行い,OpenGLおよびGLUTを利用して画面に表示する.
  6. 1〜5を繰り返す.

SML#では浮動小数点数を機械にとって自然な表現のまま扱うため,浮動小数点数の配列をそのままCの関数に渡すことができ,さらにSML#プログラム上でも浮動小数点演算を高速に行うことができる.このような特長のおかげで,spectrumプログラムは多くの浮動小数点の操作・演算を行っているにもかかわらず,ネイティブコードコンパイルを行わなくても実時間アニメーションが可能なほど高速に動作する.

サンプルプログラムの実行方法

このサンプルプログラムを実行するには,GNU Scientific Libraryが事前にインストールされていなければならない.

また,このサンプルプログラムはglutサンプルと同様に実験的なCConfigライブラリを使用している.実行するには,OpenGLを用いた3Dグラフィックスアニメーション例を参考に環境変数を適宜設定すること.

UNIX系OSでの例:

env CPPFLAGS='-I/usr/X11R6/include -I/usr/local/include' \
    LDFLAGS='-L/usr/X11R6/lib -L/usr/local/lib' smlsharp load.sml

Mac OS Xでの例:

env CPPFLAGS=-I/sw/include LDFLAGS=-L/sw/lib \
    LDD='otool -L' smlsharp load.sml

Cygwinでの例:

env CPPFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib \
    LIBNAME_SUFFIX=.dll LDD=cygcheck ARCSEP='\' smlsharp load.sml

プログラムに与えるオーディオストリームは別途用意する必要がある.フォーマットは signed 16bit stereo raw である.オーディオストリームを生成する適当なツールがない場合は,spectrumサンプルに付属するCプログラムsine.cをコンパイルして実行すれば正弦波を得ることができる.

Last modified:2007/03/30 11:59:45
Keyword(s):
References:[Cとのシームレスな連携] [プログラミング例]