紫ライブラリの開発が一段落ついたため、いよいよその上で動かすアルゴリズムに手を付けることにしました。そこで一念発起してSimulinkとDSP system toolboxを購入しました。MATLAB home editionとSignal Processing Toolboxは購入したまま死蔵しているのものがありましたので、これで一通りそろったことになります。
フィルターデザイナーによる設計
さて、MathworksのびっくりするほどよくできたチュートリアルとMATLAB Onlineで遊んでいましたが、一歩前進してフィルタの設計をするときに躓いたので記しておきます。
フィルタには設計はフィルターデザイナーを使いました。このデザイナーはコード生成機能を持っており、作ったフィルタをMATLABのシステムオブジェクトとして返す関数を生成します。
以下のサンプルで、lpf_7khzがフィルターデザイナーによって生成された関数です。関数の返り値はシステムオブジェクトで、変数lpfに代入されます。fvtoolで確認すると、lpfがカットオフ7kHzのフィルタになっていることがわかります。
lpf = lpf_7khz; fvtool(lpf, 'Analysis', 'Freq');
ここで、試験用にインパルス・データを作ります。このデータは1行1024列の行列です。中身は最初の要素だけ1で、あとは0です。少々見づらいですが、グラフからも最初だけ1であとは0と読み取れます。
impuls = zeros(1,1024); impuls(1) = 1; plot( impuls);
さて、こうやって作ったインパルス信号ですが、1行1024列のデータをlpfに与えても希望の結果は得られません。フィルターデザイナーはDSP System Toolkitの機能を使っています。そして、いろいろ調べたところではDSP System Toolkitは時間を列方向で表すようです。なのでlpfに行方向に時間が進むimpulsを与えても正しい出力になりません。
ということで、作ったインパルス信号を転置し、それをlpf関数に与えます。
transposed_impuls = impuls.'; filtered = lpf(transposed_impuls); fvtool(filtered);
繰り返しますが、lpfはフィルターデザイナーが作った設計関数によるシステムオブジェクトです。このシステムオブジェクトは関数としてふるまい、入力に信号を与えると、出力はフィルタ済み信号となります。
上の実行中、transposed_impulsとfilteredは1024行1列の信号になっています。これはモノラル信号です。
まとめ
チュートリアルやヘルプにははっきり書いていませんが、DSP System Toolboxでは、時間を列方向で表しています。理由はよくわかりませんが、ひょっとするとテキストファイルにシステムが印字するときのフォーマットと相性が良いからかもしれません。
プリントアウトっぽいですよね。