━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 高速フ−リエ変換による音声スペクトル表示 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ プログラム名:FFT.BAS 対応機種 :FM TOWNS 作者 :歩野零一 ● 口 上 このプログラムは,TOWNSのマイクで取り込んだPCM音声を, 高速フ−リエ 変換を利用して, 音声のスペクトル表示をするものです。 音声処理のツ−ルとして, F-BASIC386による科学技術計算のサンプルとして御利用ください。なお, このプログ ラムは, ◎h!FM'90年7月号掲載のものを,作者の歩野零一氏および◎h!FM編集 部のご好意で収録しています。 ●使い方  F-BASIC386(レベルは問わず)をたちあげてから,FFT.BASをロ−ドして実 行してください。  まず,PCMデータの解析をする前に,FFTの動作を確認する意味で,計算され た波形を解析してみましょう。リストの1040行をTESTF=0をTESTF=1に して走らせてみます。すると,1220行からのルーチンで計算された波形のスペクトル 分析をします。1240行は,デューティ比が小さい矩形波,1250行はFM音源のシミュ レートです。どちらかのREMをはずして計算させてみてください。  このデータでは,元の波形がきれいに計算されたデータなので,スペクトルもきれ いに出ています。次はいよいよPCMで取り込んでみます。1040行をTESTF=0 に戻して実行すると,マイクからの音声を取り込んで,上の段に表示し,スペクトル をFFTで計算して,下の段に表示します。スペクトルは一番左が周波数0,つまり DCのパワーで,その次の赤色の棒が基準の周波数スペクトルになります。以下右に 向かって1倍,2倍,3倍ccの倍音スペクトルが並んでいるわけですが,わかりや すいように10ごとに棒の色を変えてあります。  右上のインジケータは,プログラムの状態を表しているもので, "INIT" がテ ーブル等の初期化 , "STANDBY" はPCMレコーディングの準備状態,"RE CORD" はサンプリング中, "SETUP" はサンプリングデータの前処理, "F FT" はフーリエ変換, "POWER" はパワースペクトルの計算をそれぞれ表して います。  その下はFFTのモードの表示と変更のためのフィールドです。それぞれの緑色の パラメータの部分をマウスで左クリックすることで,パラメータが順次変わります。 "SAMPLE" はサンプリングのデータ数で, 128,256,512のいずれかを選択でき ます。 "FREQ" はサンプリング周波数で,4800,9600,19200(Hz)を選べます。 この "SAMPLE" と "FREQ" の2つのパラメータで,FFTの基本周波数が 決定され,スペクトルのグラフの下に数値で表示されます。 "SCALE" は,パワ ースペクトルの縦軸のスケーリングを表します。 "LINEAR" が線形のスケール で, "LOG" が対数のデシベル表示になっています。いずれのスケーリングも,パ ワースペクトルの最大値を基準の1.0としています。   "MODE" は,メインループのモードで, "AUTO" にしておくと,次々にサ ンプリングしては,FFTを計算し,スペクトルを表示するということを自動的に繰 り返します。 "ONCE" モードでは, "STANDBY" の状態で止まりますから, ここで何かキーをタイプした瞬間にサンプリングを実行します。 "WINDOW" は, ハミング窓による窓関数処理を実行するかどうかのフラグで,ON/OFFのいずれか の状態にできます。  一番下の "START" をマウスの左ボタンでクリックすると,FFTのメインル ープが始まります。 "AUTO" モードになっていると,そのまま自動的にサンプリ ング−FFT−スペクトルの表示のループに入ります。この状態で,マウスの左ボタ ンをクリックすると,その瞬間にサンプリング状態になり,右ボタンのクリックで, 最初のモード選択状態に移行します。  以上ごちゃごちゃと解説しましたが,走らせてみればだいたいわかると思います。 サンプリングは内蔵マイクでももちろんできますが,外部マイクのほうがきれいに取 り込めるようです。  プログラム内容ですが,下記にラベルごとのルーチンの一覧表を載せておきました ので,それを参考にしてください。 ┌──────────┬─────────────────────────┐ │*MLOOP   │メインループ。ここでサンプリング−FFT−プロット│ │ │を繰り返す │ │ │ │ │*SETDATA │テスト用の波形計算ルーチン。ここにいろいろな関数を│ │ │書くことで,好きな波形の解析ができる │ │ │ │ │*INIT │イニシャライズルーチン。計算用の配列の初期化など │ │ │ │ │*SINIT │画面周りの初期化 │ │ │ │ │*FFT │FFTの計算ルーチン │ │ │ │ │*POW │パワースペクトルの計算とdbデータへの変換 │ │ │ │ │*HAMMING │ハミング窓関数 │ │ │ │ │*SCREEN │波形のプロットルーチン │ │ │ │ │*PLOT │スペクトルのプロットルーチン │ │ │ │ │*RECORD │PCMサンプリングルーチン │ │ │ │ │*SETSAMPLE│PCMデータを計算可能なデータに正規化 │ │ │ │ │*M0USE2 │マウス左ボタン割り込みルーチン │ │ │ │ │*M0USE4 │マウス右ボタン割り込みルーチン │ │ │ │ │*MOSLOOP │モード設定のユーザインタフェースルーチン │ │ │ │ │*VSCALE │スペクトルの縦方向のスケールを描く │ │ │ │ │*HSCALE │基本波の周波数を表示 │ │ │ │ │*COND │モードのタイトルを表示 │ │ │ │ │*CONDSET │モードの状態を表示 │ └──────────┴─────────────────────────┘ ● 著作権・再配布について このプログラムの著作権は作者が保持しておりますが,著作権法の定める「個人的 な利用」の範疇であれば自由に利用してくださってけっこうです。また,転載・配布 についても事前の許諾なしに自由に行ってくださってかまいません。ただし配布時に, 1. 「歩野零一」がプログラミングしたものであること 2. Oh!FM'90年2月号に掲載されたものであること 3. 作者の自由転載許可に基づいて転載・配布したものであること の旨を,説明用のテキストに明記してください。