手習ひデジタル信号処理(134) Scilab、conv、convol、離散一次元畳み込み

Joseph Halfmoon

忘却力のお惚け老人も見た瞬間は分かった気になるので毎日のようにYou Tube様など視聴させていただいております。今回はコンボルーションについての解説動画を見ていて思い至りました。そういえばScilabのconv関数、「ちゃんとした」使い方を確認してなかったなと。分からないまま使っていた砂上の楼閣状態?

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上のScilab6.1.1およびScilab上のツールボックスを使用させていただいております。

3Blue1Brown

お惚け老人が毎日のように視聴さてていただいているYou Tube様の番組はみんな大好き 3Blue1Brown様 の「日本語版」の 3Blue1BrownJapan様のビデオです。座って画面を眺めているだけで、なにか立派な人になれたんじゃないか(錯覚ですが)と思う分かり易い上にとても面白いビデオです。ありがとうございます。

さて今回視聴させていただいたのは以下です。

畳み込みの仕組み|Convolution

これまた眺めているだけで畳み込みが理解できた(気になる)逸品であります。しかし、そういえば、Scilabのconv関数、無意識に使っていたな。コンボルーションでしょ。。。これはイケない、マジメに使い方を確認しておかないと。

Scilabのconv関数

Scilabには1次元と2次元の畳み込み関数存在してます。今回調べるのは1次元の方だけです。オンラインヘルプページが以下に。

conv 離散1次元畳み込み

主要な引数は2つ、AとBです。信号にフィルタをかけるような処理の場合、先に与えるAの方に信号ベクトル、後から与えるBの方にカーネルを与えればコンボルーションした結果が返ってきます。お楽ね。

しかし改めてHelpページを眺めてみると [,shape] というオプションがあったではないですか。オプション文字列によって挙動が変わるのでした。あちゃ~確かめもせずに使っていたな。「折角なので」オプションによる挙動の違いを勝手な図にして描いてみましたぞ。

以下の図では3要素のベクトルAとBのコンボルーションをとる時です。ConvOptions

上記のように、何も指定しないとデフォルトは “full”の動作をするのです。Aに対してBを「ずらしながら」コンボルーション計算していくにあたって、AとBの重なりが最低の1しかないところから全ての組み合わせを計算していくのがfullです。それに対して、Aと同じサイズの長さに制限するのがsame、AとBの要素の全てに漏れなくお相手がいる場合の結果だけを取り出すのがvalidということみたいです。

計算例1

3Blue1Brown様でも計算例に使っていた例が以下に。そのときは full のところだったですが、今回はゴージャスに全オプションを実施。

A=[1 2 3];
B=[4 5 6];
Cfull = conv(A, B, "full")
Csame = conv(A, B, "same")
Cvaild = conv(A, B, "valid")

上記の実行結果が以下に。conv_1

計算例2

気持、Aが短くて最後のvalidなどが素気なさすぎるのでAをちょい長にしてみました。その場合の結果が以下に。conv_2

FFTつかったコンボルーション関数

3Blue1Brown様の上記のビデオでも、コンボルーションは計算負荷が重いのでそれを軽くする(N*log(N))ためのFFTつかった方法があるということでとても分かり易い説明がありました。素人老人は目から鱗であります。ま、当然ながらScilabにも同様な関数はありです(デカイ相手に対してはconvより速いのだと思う。確かめてないけど。)その名は convol っす。

しかし、Helpファイルをよく見もせずに convol 使ってみたら以下のようになりました。convol

 

上の conv関数のように、オプションの引数を与えることには対応してないようです。上記では黄色のマーカのようにエラーになってしまいます。オプション引数はなし、デフォルトのfull のみ、ということみたいっす。オプション引数を消したら、緑のマーカのようにお答えが得られます。なんだ、いつもの使い方だったらOKなのね。

改めて調べてみるといろいろあるな~

手習ひデジタル信号処理(133) Scilab、伝達関数の周波数応答のピーク検出、一撃よ へ戻る

手習ひデジタル信号処理(135) Scilab、離散二次元畳み込み、前後に一手間いるのよ へ進む