2012年1月28日土曜日

SimuLinkの使い方

まだまだ使い始めて日が浅いけど、こんな感じ。
MATLAB文法は、ある程度知っていればおK。


ブロック図を書きます。
単純に、入力信号を5倍にして上限下限で区切って量子化してビットシフトして1次元ルックアップテーブルで値変換する、というもの。

言語をCに設定して生成させたコードがこれ。

void sample1_step(void)
{
  real_T u;
  u = sample1_P.Gain_Gain * sample1_U.In1;
  u = ldexp(rt_roundd_snf((u >= sample1_P.Saturation_UpperSat ?
              sample1_P.Saturation_UpperSat : u <= sample1_P.Saturation_LowerSat
              ? sample1_P.Saturation_LowerSat : u) /
             sample1_P.Quantizer_Interval) * sample1_P.Quantizer_Interval,
            (int32_T)sample1_P.ShiftArithmetic_Power2Exponent);
  u = floor(u >= 3.0 ? 3.0 : u <= 0.0 ? 0.0 : u);
  if (rtIsNaN(u) || rtIsInf(u)) {
    u = 0.0;
  } else {
    u = fmod(u, 4.294967296E+9);
  }

  sample1_Y.Out1 = sample1_P.Constant_Value[(uint32_T)u];
}

sample1_Pがパラメタ
sample1_Uが入力
sample1_Yが出力

で、それぞれ、以下のように定義される。

typedef struct {
  real_T In1;
} ExternalInputs_sample1;

typedef struct {
  real_T Out1;
} ExternalOutputs_sample1;

struct Parameters_sample1_ {
  real_T Gain_Gain;
  real_T Saturation_UpperSat;
  real_T Saturation_LowerSat;
  real_T Quantizer_Interval;
  real_T Constant_Value[4];
  int16_T ShiftArithmetic_Power2Exponent;
};

extern Parameters_sample1 sample1_P;
extern ExternalInputs_sample1 sample1_U;
extern ExternalOutputs_sample1 sample1_Y;

コンパイルのオプションがいっぱいあるので、一番組み込みやすいコードを吐くオプション設定がわからないけど、これくらいのコードを生成してくれるなら組み込みも容易です。

SimuLinkには、フィードバックループ等のブロック図作成用ブロックやfft等のDSP処理、各種数値演算(ARとか移動最小二乗法とか)が色々用意されているので、大抵の信号処理コードは簡単にできるんじゃないかな。

0 件のコメント:

コメントを投稿