
ラズパイPicoの特長の一つであるinterpを扱って三回目にして、ようやく回路名称である interpolator (補間器)の主目的である補間を試みてみます。今回は整数型のシンプルな線形補間です。Blend Modeというモードを設定するだけで、後はレジスタに値を書き込むだけで補間を行ってくれます。便利っちゃ便利ですが、Blend Modeって何者?という疑問が残ります。
※「Pico三昧」投稿順 index はこちら
参照しているのは 以下のデータシートです。SIO(Single-cycle IOです。シリアルIOではありませぬ)という一項目で30ページ以上も説明のある中に interpolator の説明があり、その奥の方に今回フォーカスしている Blend Mode の説明があります。
冒頭のアイキャッチ画像に、このモードで計算できる線形な整数の補間機能の式を掲げました。二つの入力 X0、X1があったときに、その間を256等分のα(αは0以上255以下)した値を返すというもの。もしかするとアルファ・ブレンディングなどの計算に使うつもりでBlendモードと唱えているのかも知れませんが、お名前の由来は書いてないみたいです。
早速サンプルテストプログラム作成
データシートの例を参考に、早速サンプルプログラムを書いてみました。実際の応用では数列を成して入力されてくるデータの隣り合うもの同士をX0、X1として入力して、その中間の補間値を計算しつづける、ことになるのだと思います。今回サンプルは、
- 
- X0 整数1000
- X1 整数2000
 
とキメウチのデータ組に対して、0%点(X0そのもの)、25%点、50%点、75%点と区間を4等分した途中の値を求めてみるというもの。分かり易いですかね?
イマイチどんな制御をしているのか不明な Blend モードですが、使用すること自体は簡単です。interp_config_set_blend()という関数を呼び出すだけでOK。特に面倒なパラメータの設定もなしです。前回計算要素のそれぞれを個別に設定してみましたが、そんな手間をかける必要もなかったです。
ただし、Blendモードには INTERP0 (のレーン0)にしか設定できないという制約があるみたいです。おさらいしておくと、
- 
- 2個のコアそれぞれに2個のインタポレータ、INTERP0, INTERP1を持つ
- 1個のインタポレータ内には3つのレーン、0、1、2がある
 
です。どちらのコアも1系統のBlend Modeは使える。けれどもBlendモード使用時にはINTERP0の全てのレーンがBlendモードで使われる、ということみたいです。具体的な設定としては、
- 
- レーン0、blendモードを指定
- レーン1、デフォルト設定のままにする
- レーン2、何も設定せず、放置
 
で良いようです。作成したサンプルプログラムの main()関数が以下に。その他部分、CMakeLists.txt などは、前回のものをそのまま流用しとります。
int main()
{
    const uint LED_PIN = 25;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    stdio_init_all();
    printf("Interp training 003\n");
    interp_config cfg = interp_default_config();
    interp_config_set_blend(&cfg, true);
    interp_set_config(interp0, 0, &cfg);
    cfg = interp_default_config();
    interp_set_config(interp0, 1, &cfg);
    while (1) {
        int x0 = 1000;
        int x1 = 2000;
        printf("TEST LOOP: %d\n", counter++);
        interp0->base[0] = x0; //x0
        interp0->base[1] = x1; //x1
        for (int i = 0; i<4; i++) {
            interp0->accum[1] = i * 64;
            printf("x0:%d x1:%d INTEROLATION(%d/4)=%d\n", x0, x1, i, interp0->peek[1]);
        }
        gpio_put(LED_PIN, 1);
        sleep_ms(1000);
        gpio_put(LED_PIN, 0);
        sleep_ms(1000);
    }
    return 0;
}
サンプルテストプログラム作成
データシートの例を参考に、早速サンプルプログラムを作成いたしました。WindowsPC上のVSCodeから、ラズパイPicoの母艦であるRaspberry Pi 4にSSH接続し、ラズパイPicoにSWDデバッグを行っているところが以下に。
x0とx1の値、0点、4分の1、4分の2,4分の3の値が読めているのが見えますかね。
設定さえすれば、値の読み書きだけで補間できてしまう interp は計算はお楽。でも設定の裏側には今だ隠された秘密がある感じです。わたしゃそこが知りたいですが、ソース読むのメンドイ、気力が無い。。。


