MATLABのDSP System Toolbox は時間を列の方向にとる

紫ライブラリの開発が一段落ついたため、いよいよその上で動かすアルゴリズムに手を付けることにしました。そこで一念発起して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');
figure_0.png
作ったフィルタの伝達関数。周波数特性と位相。

ここで、試験用にインパルス・データを作ります。このデータは1行1024列の行列です。中身は最初の要素だけ1で、あとは0です。少々見づらいですが、グラフからも最初だけ1であとは0と読み取れます。

impuls = zeros(1,1024);
impuls(1) = 1;
plot( impuls);
figure_1.png
インパルス

さて、こうやって作ったインパルス信号ですが、1行1024列のデータをlpfに与えても希望の結果は得られません。フィルターデザイナーはDSP System Toolkitの機能を使っています。そして、いろいろ調べたところではDSP System Toolkitは時間を列方向で表すようです。なのでlpfに行方向に時間が進むimpulsを与えても正しい出力になりません。

ということで、作ったインパルス信号を転置し、それをlpf関数に与えます。

transposed_impuls = impuls.';
filtered = lpf(transposed_impuls);
fvtool(filtered);
figure_2.png
インパルス応答の処理結果。当然だが伝達関数の特性と同じ。

繰り返しますが、lpfはフィルターデザイナーが作った設計関数によるシステムオブジェクトです。このシステムオブジェクトは関数としてふるまい、入力に信号を与えると、出力はフィルタ済み信号となります。

上の実行中、transposed_impulsとfilteredは1024行1列の信号になっています。これはモノラル信号です。

まとめ

チュートリアルやヘルプにははっきり書いていませんが、DSP System Toolboxでは、時間を列方向で表しています。理由はよくわかりませんが、ひょっとするとテキストファイルにシステムが印字するときのフォーマットと相性が良いからかもしれません。

プリントアウトっぽいですよね。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください