ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

buffer

信号ベクトルをデータ フレームの行列にバッファー

構文

y = buffer(x,n)
y = buffer(x,n,p)
y = buffer(x,n,p,opt)
[y,z] = buffer(...)
[y,z,opt] = buffer(...)

説明

y = buffer(x,n) では、長さ L の信号ベクトル x が、長さ n のオーバーラップのないデータ セグメント (フレーム) に分割されます。各データ フレームは、行列出力 y の 1 つの列に対応します。この行列は、nceil(L/n) 列になります。Ln で割り切れない場合、最後の列には長さが n になるようにゼロが付加されます。

y = buffer(x,n,p) では、出力行列の連続するフレームで p 個のサンプルがオーバーラップまたはアンダーラップされます。

  • 0 < p < n (オーバーラップ) の場合、関数 buffer では各フレームの最後にある p のサンプルが、次のフレームの最初に繰り返されます。たとえば、x = 1:30n = 7 の場合、p = 3 のオーバーラップは以下のようになります。

    最初のフレームは、p 個のゼロ (既定の初期条件) から始まり、y の列数は、ceil(L/(n-p)) です。

  • p < 0 (アンダーラップ) の場合、関数 buffer は、連続するフレームの間で p 個のサンプルをスキップします。たとえば、x = 1:30n = 7 の場合、p = -3 のアンダーラップは以下のようになります。

    y の列数は ceil(L/(n-p)) です。

y = buffer(x,n,p,opt) では、オーバーラップするバッファー内で x(1) の前にあるサンプル ベクトル、またはアンダーラップするバッファー内でスキップする初期サンプル数のいずれかが指定されます。

  • 0 < p < n (オーバーラップ) の場合、opt によってバッファー内で x(1) の前に挿入する長さ p のベクトルが指定されます。このベクトルは "初期条件" とみなすことができ、現在のバッファー処理が、連続バッファー処理のうちの 1 つである場合に必要です。あるバッファーと次のバッファー間で望ましいオーバーラップを維持するために、opt にはシーケンス内にある前のバッファーから最後の p 個のサンプルを含めるようにします。以下の連続バッファー処理を参照してください。

    既定の設定では、opt は、オーバーラッピング バッファーに対しては zeros(p,1) です。opt'nodelay' を設定すると、初期条件がスキップされ、x(1) からバッファー処理が始まります。この場合、Llength(p) 以上の長さでなければなりません。たとえば、x = 1:30n = 7 の場合、p = 3 のオーバーラップのバッファーは以下のようになります。

  • p < 0 (アンダーラップ) の場合、opt[0,-p] の範囲の整数値で、バッファーにサンプルを追加する前にスキップする初期入力サンプル数 x(1:opt) を指定します。このため、バッファーの最初の値は、x(opt+1) になります。既定の設定では、opt はアンダーラッピング バッファーに対してはゼロです。

    このオプションは、現在のバッファー処理が連続バッファー処理のうちの 1 つである場合に特に便利です。あるバッファーと次のバッファーの間で望ましいフレーム アンダーラップを維持するには、opt は、フレーム間でスキップする点の総数 (p) と、buffer への前の入力でスキップ "可能" な点数の差に等しくなければなりません。前の入力に含まれている点の数が、そのバッファーの最後のフレームを埋めた後にスキップできる点の p よりも少ない場合は、残りの opt 個の点を現在のバッファーの最初のフレームから削除する必要があります。これが実際にどのように機能するかの例は、連続バッファー処理を参照してください。

[y,z] = buffer(...) では、長さ L の信号ベクトル x が長さ n のフレームに分割され、"完全な" フレームのみが y に出力されます。y がオーバーラッピング バッファーの場合、nm 列の行列になります。ここで、length(opt) = p のときは m = floor(L/(n-p))opt = 'nodelay' のときは m = floor((L-n)/(n-p))+1 です。

y がアンダーラッピング バッファーの場合、nm 列の行列になります。ここで、m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n) です。

適切なオーバーラッピングまたはアンダーラッピングの処理後の入力ベクトル内のサンプル数が、nm 列のバッファーに格納可能な数を超えた場合、x 内の残りのサンプルはベクトル z に出力されます。ここで、オーバーラッピング バッファーの長さは、length(opt) = p のときは L - m*(n-p)opt = 'nodelay' のときは L - ((m-1)*(n-p)+n)、アンダーラッピング バッファーの長さは、(L-opt) - m*(n-p) です。

出力 z は、x と同じ方向 (列方向または行方向) になります。指定のオーバーラップまたはアンダーラップによりバッファーが埋められた後、入力にサンプルが残っていない場合、z は空ベクトルになります。

[y,z,opt] = buffer(...) では、出力 opt にオーバーラッピング バッファーの最後の p 個のサンプルが返されます。アンダーラッピング バッファーの場合、opt は、フレーム間でスキップする点の総数 (-p) と最後のフレームを埋めた後にスキップ "可能" だった x 内の点数との差です。

  • 0 < p < n (オーバーラップ) では、出力 opt には、バッファーの最後のフレームにある最後の p 個のサンプルが含まれています。このベクトルは、連続バッファー処理シーケンスにおいて、後続バッファー処理の "初期条件" として使用できます。これにより、バッファー間で望ましいフレームのオーバーラップを維持できます。以下の連続バッファー処理を参照してください。

  • p < 0 (アンダーラップ) の場合、出力 opt は、フレーム間でスキップする点の総数 (-p) と、最後のフレームを埋めた後にスキップ "可能" だった x 内の点数との差であり、opt = m*(n-p) + opt - L となります。ここで、右辺の optbuffer の入力引数、左辺の opt は出力引数です。z は空のベクトルです。ここで m はバッファー内の列数で、m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p))>=n) になります。

    出力 z にデータが含まれる場合、アンダーラップ バッファーの出力 opt は常にゼロです。

    アンダーラッピング バッファーに対する出力 opt は、現在のバッファー処理が一連の連続バッファー処理のうちの 1 つである場合に特に便利です。各バッファー処理からの opt 出力では、バッファー間で望ましいフレームのアンダーラップを維持するために、次のバッファー処理を開始する前にスキップするサンプル数が指定されます。現在のバッファーの最後のフレームを埋めた後、スキップできる点が p よりも少ない場合は、残りの opt 個の点を次のバッファーの最初のフレームから削除する必要があります。

一連のバッファー処理では、各処理からの opt 出力が後続のバッファー処理への opt 入力として使用されます。これによって、バッファー間、およびバッファー内のフレーム間で、望ましいフレームのオーバーラップやアンダーラップが維持されます。これが実際にどのように機能するかの例は、以下の連続バッファー処理を参照してください。

すべて折りたたむ

各フレームが 11 個のサンプルをもつ、100 個のフレームで構成されるバッファーを作成します。

data = buffer(1:1100,11);

行列 data 内のフレーム (列) は、物理的な信号をサンプリングしているデータ収集ボードの連続的な出力であるとします。つまり、data(:,1) は最初の 11 個の信号サンプルを含む最初の D/A 出力、data(:,2) は次の 11 個の信号サンプルを含む 2 番目の出力、のようになります。

この信号のフレーム サイズを既得の 11 から 4 に変更し、オーバーラップ 1 で再バッファーするとします。連続する入力フレームそれぞれについて buffer を呼び出して処理を行い、opt パラメーターを使用してバッファー間で一貫したオーバーラップを維持します。

バッファーのパラメーターを設定します。y(1) には -5 の値を指定します。次に持ち越されるベクトルは最初は空です。

n = 4;
p = 1;
opt = -5;
z = [];

ここで、data から新しい信号フレーム (列) を渡すたびに、関数 buffer を繰り返し呼び出します。z で返されるオーバーフロー サンプルが次の処理に持ち越され、次に関数 buffer が呼び出される際に入力の最初に追加されます。

for i = 1:size(data,2)
   x = data(:,i);
   [y,z,opt] = buffer([z;x],n,p,opt);
end

次に、最初の 4 回の反復で実行される内容を示します。

出力行列 y のサイズは、反復ごとに 1 列増減する場合があります。これは、オーバーラップやアンダーラップを行うバッファー処理で一般的なものです。

各フレームが 11 個のサンプルをもつ、100 個のフレームで構成されるバッファーを作成します。

data = buffer(1:1100,11);

最初の 11 個の信号サンプルを含む最初の D/A 出力を data(:,1)、次の 11 個の信号サンプルを含む 2 番目の出力を data(:,2) とし、以下同様に続けます。

この信号のフレーム サイズを既得の 11 から 4 に変更し、アンダーラップ 2 で再バッファーするとします。このためには、連続する入力フレームそれぞれについて buffer を繰り返し呼び出して処理を行い、opt パラメーターを使用してバッファー間で一貫したアンダーラップを維持します。

バッファーのパラメーターを設定します。新しいフレーム サイズ 4、アンダーラップ -2 を指定します。opt を 1 に設定することによって、最初の入力要素 x(1) をスキップします。次に持ち越されるベクトルは最初は空です。

n = 4;
p = -2;
opt = 1;
z = [];

ここで、data から新しい信号フレーム (列) を渡すたびに、関数 buffer を繰り返し呼び出します。z で返されるオーバーフロー サンプルが次の処理に持ち越され、次に関数 buffer が呼び出される際に入力の最初に追加されます。

for i = 1:size(data,2)
   x = data(:,i);
   [y,z,opt] = buffer([z';x],n,p,opt);
end

次に、最初の 3 回の反復処理で実行される内容を示します。

出力行列 y のサイズは、反復ごとに 1 列増減する場合があります。これは、オーバーラップやアンダーラップを行うバッファー処理で一般的なものです。

診断

オーバーラッピング バッファーで、p ≥n または length(opt)length(p) の場合、以下のエラー メッセージが表示されます。

フレームのオーバーラップ P は、バッファー サイズ N 未満でなければなりません。
初期条件は長さが P のベクトルとして指定しなければなりません。

詳細

すべて折りたたむ

連続バッファー処理

連続バッファー処理において、関数 buffer へのベクトル入力は、離散信号を構成する一連のフレームの中の 1 つのフレームを表しています。これらの信号フレームは、フレームベースのデータ取得プロセス、または FFT などのフレームベースのアルゴリズムから生じています。

例として、A/D カードを使用して、64 個のサンプルで構成されるフレームからデータを取得するとしましょう。最も簡単な例としては、16 のサンプルで構成されるフレームにデータを再バッファーできます。つまり、n = 16 と指定して buffer を使用すれば、それぞれ 64 個の要素をもつ入力フレームから 4 フレームのバッファーを作成できます。結果として、フレーム サイズ 64 の信号がフレーム サイズ 16 の信号に変換されます。サンプルが追加または削除されることはありません。

一般的な例として、元の信号のフレーム サイズが L で、新しいフレーム サイズ n で割り切れない場合は、最後のフレームに収められなかったデータを識別して、次のバッファーに含めなければなりません。このためには、次に示すように、2 つの出力引数をもつ構文で入力 x に対して buffer を反復して呼び出します。

[y,z] = buffer([z;x],n)     % x is a column vector.
[y,z] = buffer([z,x],n)     % x is a row vector.

これによって z でのバッファー オーバーフローがすべて捕えられ、関数 buffer を次に呼び出す際の入力に含められます。ここでも、フレーム サイズ L の入力信号 x がフレーム サイズ n の信号に変換され、サンプルの追加や削除は行われません。

連続バッファー処理は、単出力構文 y = buffer(...) では実行できないことに注意してください。これは、この場合 y の最後のフレームにゼロが付加されており、信号に新しいサンプルが追加されるためです。

オーバーラップまたはアンダーラップを行う場合、連続バッファー処理は opt パラメーターを使用して行われます。このパラメーターは関数 buffer の入出力の両方に使用されます。このページの 2 つの例で、opt パラメーターの使用方法を示します。

参考

R2006a より前に導入