通信関係の調べ物をしているときに"TIMS"というシステムに行き当たりました。電気通信技術習得用の実験装置ですが、発信機や乗算器、加算器といったモジュールを配線でつないでいくことで簡単にシステムを組んで動作を確認できるというものです。電子ブロックの超高機能版ともいえます。
面白そうだったので2191用に同様のライブラリを用意することにしました。これまで作ってきたフィルタやオシレーターなどもインターフェースがまちまちなので、全部統一した新しい枠組みに押し込んでいます。signalToolBoxと名づけたのですが、MATLABに同名の機能があるのでsignalToolKitと変更しました。
このツールキットは以下のブロックダイアグラムで用いられるような信号処理ブロックを提供します。
図1 振幅変調器
図の中の発信器や、図に書いていませんがフィルターなどはC++言語のクラスとして実装します。これによって内部状態を外部から遮蔽し、複数のオブジェクトを簡単に実装することができます。また、乗算器や加算器は関数として実装します。
signalToolKitを使うにはインクルードファイル"signaltoolkit.h"を読み込みます。このインクルードファイルは名前空間をひとつだけ持っており、すべてのクラスはその名前空間stkに属しています。
それぞれのブロックに相当するクラスはrunメソッドを持っています。runメソッドはその機能ブロックの機能を実行します。たとえばCFilter::runは与えられたソースベクトルをフィルターにかけます。
処理すべき要素の数は引数countで与えます。レートコンバーターの場合、countは入力要素数です。
ソースとディスティネーションベクトルは要素を連続的に配置します。不連続のデータとの間でやり取りを行うためにcopy関数を用意しています。
CFilterクラスはCFirFilter、CUpSampler、CDownSampler等を子の要素に持つ抽象クラスです。このクラスのコンストラクタはインパルス応答の配列を受け取り、ポインタを内部に格納します。コピーなどは行わず、与えられた配列をそのままインパルス応答配列として使用します。
class CFilter{ protected: short * h; // インパルス応答。 short * delayline; // 遅延線(状態変数)。 short * curptr; // 現在の遅延線上のポインタ。 int taps; // タップ数。この変数はコンストラクタ呼び出しによって public: CFilter(); CFilter( int aTaps, short *coeffInit ); virtual ~CFilter(); virtual void run( short dst[], // 出力データ short src[], // 入力データ unsigned int count )=0; };
COscillatorクラスは CSinCosDDSを子に持つ抽象クラスです。このクラスは正弦波と余弦波を同時に生成できます。周波数は32ビット精度で指定できます。
位相は360度を32ビットであらわします。また、周波数は1サンプルあたりの位相変化量です。runメソッドは単一正弦波を生成するだけのものと、正弦波と余弦波を同時に生成するものを用意しています。
class COscillator { protected: int phase[4]; // phaseは内部位相(L,H)と周波数(L,H)の4ワードからなる public: COscillator( unsigned int freqH, unsigned int freqL ); virtual ~COscillator(){}; virtual void setFreq( unsigned int freqH, // 周波数の上位16ビット unsigned int freqL // 周波数の下位16ビット ); // 位相の強制変更 virtual void setPhase( unsigned int phaseH, // 位相の上位16ビット unsigned int phaseL // 位相の下位16ビット ); // 周波数の強制変更 virtual void addFreq( unsigned int freqHDelta, unsigned int freqLDelta ); virtual void addPhase( unsigned int phaseHDelta, unsigned int freqLDelta ); virtual void run ( short i[], unsigned int count )=0; virtual void run ( short i[], short q[], unsigned int count )=0; };
ダウンロードしたライブラリをプロジェクトに追加して使用します。例については近々別ページで説明します。
ソースおよびライブラリダウンロード: signal.zip (56KB)
次は⇒