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 件のコメント:
コメントを投稿