コラム32 FIRフィルタを実行するCソース(firexec.c)の説明


■将来のリアルタイム化を見越したC言語コーディング

 WAVEファイルを読み込んで信号処理する場合、基本的に2通りのやり方があります。図3-24にそれらを示します。



●英語の本をじっくり翻訳して日本語版にするイメージ

 図3-24 (a)はWAVEファイルをいったん「全部」読み込んでメモリ領域に置き、じっくり信号処理しながらその結果をWAVEファイルに書き込むやり方です。


●英語のスピーチを聞きながら同時通訳するイメージ

 同図(b)はWAVEファイルからデータを1個読むたびにリングバッファ(400ワード)に書き込み、その後すぐにリングバッファを読み出し、信号処理を行ってデータを1個計算し、WAVEファイルに書き込んでいくやり方です。


●前者はハードウエア向きでない

 前者はWAVEファイルが小さければよいのですが、何十分、何時間と巨大になるとラズベリーパイやパソコンのメモリを浪費し、アプリケーションが不安定になることがあります。

 また図3-25のような
リアルタイムシステムを考えます。同図ではマイク→A-Dから次から次へとデータが入ってきて、フィルタリングを行い、途切れることなくD-A→スピーカーにデータを送ります。そのようなシステムでは、入力データを全部メモリに溜め込むようなことは出来ません。


   図3-25 リアルタイム信号処理システム


●リングバッファにぐるぐる書いて読むC言語コーディング

 したがってラズベリーパイで実行する段階から、将来的なリアルタイム化することを見越したコーディングが必要になります。コラム31で使用したCソース(firexec.c)はそのようなコーディングになっています。filter関数内にリングバッファがあり、図3-24(b)のような使い方をしているので参考にしてください(リスト3-1)。




目次へ戻る