Main Content

MATLAB からのコード生成における入力の指定

入力のサイズとタイプの定義

Signal Processing Toolbox™ 関数をコード生成で使用する際は、関数入力のサイズとタイプを定義しなくてはなりません。これを行う 1 つの方法は、-args コンパイル オプションを使うことです。入力のサイズとタイプを定義しなければならないのは、C が静的形式の言語のためです。入力のサイズとタイプを定義する必要を説明するため、2 つの入力引数を必要とする xcorr への最も簡単な呼び出しについて考えてみましょう。以下に、xcorr の MATLAB® における使用と MATLAB からのコード生成における使用の違いを示します。

MATLAB で、2 つのホワイト ノイズベクトルの相互相関を求めます。

x = randn(512,1); %real valued white noise
y = randn(512,1); %real valued white noise
[C,lags] = xcorr(x,y);
x_circ = randn(256,1)+1j*randn(256,1); %circular white noise
y_circ = randn(256,1)+1j*randn(256,1); %circular white noise
[C1,lags1] = xcorr(x_circ,y_circ);

xcorr では、入力引数のサイズとタイプを必要としません。xcorr ではこの情報が実行時に取得されます。この動作を、codegen (MATLAB Coder) で作成した MEX ファイルと比較してみましょう。読み取りと書き込みの権限のあるフォルダーに、ファイル myxcorr.m を作成します。このフォルダーが MATLAB 検索パスにあることを確認してください。次の 2 行のコードをコピーして myxcorr.m に貼り付け、ファイルを保存します。ファイルにはコンパイラ タグ %#codegen を含めなければなりません。

function [C,Lags]=myxcorr(x,y)  %#codegen
[C,Lags]=xcorr(x,y);

MATLAB コマンド プロンプトで以下のコマンドを入力します。

codegen myxcorr -args {zeros(512,1),zeros(512,1)} -o myxcorr 

MEX ファイルを実行します。

x = randn(512,1); %real valued white noise
y = randn(512,1); %real valued white noise
[C,Lags] = myxcorr(x,y);

新しい 2 つの入力 x1 および y1 を、xy を転置することにより定義します。

x1 = x'; %x1 is 1x512
y1 = y'; %y1 is 1x512

転置した入力を使用して MEX ファイルを再実行します。

[C,Lags] = myxcorr(x1,y1); %Errors

このプログラムではエラーが発生し、「??? MATLAB expression 'x' is not of the correct size: expected [512x1] found [1x512]」というメッセージが表示されます。

このエラーが発生するのは、コンパイルで入力が 512x1 の実数値列ベクトルに指定されているためです。複素数値の入力に対しては、入力が複素数値であることを指定しなくてはなりません。次に例を示します。

codegen myxcorr -o ComplexXcorr ...
-args {complex(zeros(512,1)),complex(zeros(512,1))}

正しいサイズの複素数値入力を使用して、MATLAB コマンド プロンプトで MEX ファイルを実行します。

x_circ = randn(512,1)+1j*randn(512,1); %circular white noise
y_circ = randn(512,1)+1j*randn(512,1); %circular white noise
[C,Lags] = ComplexXcorr(x_circ,y_circ);

実数値入力を使用して ComplexXcorr を実行しようとすると、次のエラーが発生します。??? MATLAB expression 'x' is not of the correct complexness

入力は定数でなければならない

サポートされている Signal Processing Toolbox 関数の多くで、コンパイル時に入力または入力の一部を定数として指定することが要求されています。coder.Type-args コンパイル オプションと共に使用するか、または、ソースコードに定数を直接入力してください。

コンパイル時に入力を定数として指定すると、生成されるコードのスピードと効率が著しく向上します。たとえば、フィルター係数やウィンドウ関数の値をベクトルとして C ソース コードに保存すると、実行時に時間のかかる計算を避けることができ、パフォーマンスが向上します。MATLAB からのコード生成の主要目的はデスクトップと組み込みシステム用に最適化された C コードを作成することであるため、可能な限り、実行時の計算の無駄をなくすことに重点が置かれています。

ellip での定数入力要件を説明するために、読み取りと書き込みの権限のあるフォルダーに、ファイル myLowpassFilter.m を作成します。このフォルダーが MATLAB 検索パスにあることを確認してください。次のコードをコピーして myLowpassFilter.m に貼り付け、ファイルを保存します。

function output = myLowpassFilter(input,N,Wn) %#codegen
[B,A] = ellip(N,Wn,'low');
output = filter(B,A,input);

MATLAB Coder™ ソフトウェアがインストールされている場合は、以下のコマンドを MATLAB のコマンド プロンプトに入力してください。

codegen myLowpassFilter -o myLowpassFilter ...
-args {zeros(512,1),coder.newtype('constant',5),coder.newtype('constant',0.1)} -report

プログラムが正常にコンパイルされると、次のメッセージがコマンド ウィンドウに表示されます。Code generation successful: View report

View report をクリックします。左上にある C code タブをクリックして、ターゲットのソース ファイル myLowpassFilter.c を開きます。フィルター係数の分子と分母は、ソース コードに記されています。

定数を入力せずに MEX ファイルを実行してください。

output = myLowpassFilter(randn(512,1));

定数を入力して MEX ファイルを実行しようとすると、「??? Error using ==> myLowpassFilter 1 input required for entry-point 'myLowpassFilter'」というエラーが表示されます。

定数を MATLAB ソース コードに直接入力することも可能です。myLowPassFilter.m ファイルを編集して、MATLAB コードを以下のラインで置き換えます。

function output = myLowpassFilter(input) %#codegen
[B,A] = ellip(5,0.1,'low');
output = filter(B,A,input);

MATLAB コマンド プロンプトで以下のコマンドを入力します。

codegen myLowpassFilter -args {zeros(512,1)} -o myLowpassFilter

MATLAB コマンド プロンプトで次の式を入力して、MEX ファイルを実行します。

output = myLowpassFilter(randn(512,1));