2016-04-05 37 views
0

現在、リアルタイム信号処理用に非常に荒く機能する循環バッファを設計しようとしています。わかりやすくするために、私はDSP Toolboxライセンスを持っていません。SimulinkのサーキュラバッファがMATLAB関数として実装されました

ここで考えられるのは、1xNウィンドウ内の信号の一部をバッファし、さらに後処理することです。これを実現するために、私は次の図のようにSimulinkブロックを考えていました。

enter image description here

問題は以下の通りです:MATLAB関数は

function y = fcn(Signal,DelayedBuffer,BufferSize) 
%#codegen 
% y = zeros(1,BufferSize); 
persistent Buffer; 
Buffer = [Signal DelayedBuffer(1:59-1)]; 

y = Buffer; 
end 

すべてがうまくうまくている場合。

function y = fcn(Signal,DelayedBuffer,BufferSize) 
%#codegen 
% y = zeros(1,BufferSize); 
persistent Buffer; 
Buffer = [Signal DelayedBuffer(1:BufferSize-1)]; 

y = Buffer; 
end 

としての機能を記述するとき はしかし、私は次のエラーが表示されます

Data 'y' (#32) is inferred as a variable size matrix, while its specified type is something else.

あなたは、このエラーを抑止する方法上の任意の貴重なヒントを持っていますか?

答えて

1

MATLAB Functionブロックは、入力したMATLABコードのコンパイル済みコードを生成することによって動作します。コードを生成するために、ブロックは使用するすべての入力と変数のサイズ、タイプ、複雑さを知る必要があります。これは、入力のサイズに基づいて変数と出力のサイズを推定します。

を使用してバッファを作成すると、バッファのサイズが59要素であることがわかります(Signalはスカラーであると仮定します)。 MATLAB Functionブロックはこのサイズを推測し、割り当てられたyも識別できます。Bufferも同じサイズです。第2の場合、

バッファ= [Signal DelayedBuffer(1:BufferSize-1)];

BufferSizeは入力から来ており、MATLAB Functionブロックはコンパイル時にこの値を認識しません。したがって、この値が変更可能であり、可変サイズのデータ​​につながると仮定しなければなりません。つまり、コンパイル中にバッファのサイズを決定することはできません。バッファに割り当てられた「y」は、可変サイズのデータ​​としても推測されます。エラーメッセージは、ブロックのパラメータの出力サイズを固定サイズとして指定した可能性があることを示しています。ブログの[ポートとデータマネージャ]ダイアログには、出力ポートが可変サイズであることを示すチェックボックスがあります。そのボックスをチェックすると、そのボックスが表示されます。しかし、あなたのケースでは、循環バッファーの場合、固定サイズのデータ​​を提供する永続変数を使用する方がよいでしょう。

1回のシミュレーションでBufferSizeを変更する必要はありません。入力ではなく、MATLAB Functionブロックのパラメータとして使用してみてください。これは、[ポートとデータマネージャ]ダイアログボックスでも行うことができます。

+0

さて、バッファのサイズはシミュレーションの長さに亘って一定ですが、ユーザーがバッファのサイズを調整できるようにして、どのサイズが最適な結果を取得するのかを確認したいと思います。私はパラメータとして 'BufferSize'を割り当てようとしましたが、ポートが関数にもう接続されていないので、関数に渡す方法を明確に理解していません。 – fpe

+0

入力をパラメータとして入力すると、モデルワークスペースまたはMATLABベースワークスペースで同じ名前を使用して入力を定義できます。あなたは単にBufferSize = 59を行うことができます。コマンドラインで1つのシミュレーション内で変更する必要がないため、この調整可能にしないでください。シミュレーション間で変更することができます。 – Navan

関連する問題