Main Content

buffer

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

説明

y = buffer(x,n) では、長さ L の信号ベクトル x が、長さ n のオーバーラップのないデータ セグメント (フレーム) に分割されます。

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

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

[y,z] = buffer(___) では、長さ L の信号ベクトル x が長さ n のフレームに分割され、"完全な" フレームのみが y に出力されます。ベクトル z には残りのサンプルが含まれます。この構文には、前の構文の入力引数を任意に組み合わせて含めることができます。

[y,z,opt] = buffer(___) では、出力 opt にオーバーラッピング バッファーの最後の p 個のサンプルが返されます。

すべて折りたたむ

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

data = buffer(1:1100,11);

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

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

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

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

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

最初の 4 回の反復の場合、入力フレーム [z;x]'opt の入力値と出力値、出力バッファー y、およびオーバーフロー z を表示します。出力行列 y のサイズは、反復ごとに 1 列増減する場合があります。これは、オーバーラップやアンダーラップを行うバッファー処理で一般的なものです。

for i = 1:size(data,2)
    x = data(:,i);
    [y,z,oppt] = buffer([z;x],n,p,opt);
    if i <= 4
        disp(' '), i, ifrm = [z;x]', opts = [opt oppt], y, z, disp(' ')
   end
   opt = oppt;
end
 
i = 1
ifrm = 1×13

    10    11     1     2     3     4     5     6     7     8     9    10    11

opts = 1×2

    -5     9

y = 4×3

    -5     3     6
     1     4     7
     2     5     8
     3     6     9

z = 2×1

    10
    11

 
 
i = 2
ifrm = 1×12

    22    12    13    14    15    16    17    18    19    20    21    22

opts = 1×2

     9    21

y = 4×4

     9    12    15    18
    10    13    16    19
    11    14    17    20
    12    15    18    21

z = 22
 
 
i = 3
ifrm = 1×11

    23    24    25    26    27    28    29    30    31    32    33

opts = 1×2

    21    33

y = 4×4

    21    24    27    30
    22    25    28    31
    23    26    29    32
    24    27    30    33

z =

  0x1 empty double column vector

 
 
i = 4
ifrm = 1×13

    43    44    34    35    36    37    38    39    40    41    42    43    44

opts = 1×2

    33    42

y = 4×3

    33    36    39
    34    37    40
    35    38    41
    36    39    42

z = 2×1

    43
    44

 

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

data = buffer(1:1100,11);

最初の 11 個の信号サンプルを含む最初の A/D 出力を 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 が呼び出される際に入力の最初に追加されます。

最初の 3 回の反復の場合、入力フレーム [z';x]'opt の入力値と出力値、出力バッファー y、およびオーバーフロー z を表示します。出力行列 y のサイズは、反復ごとに 1 列増減する場合があります。これは、オーバーラップやアンダーラップを行うバッファー処理で一般的なものです。

for i = 1:size(data,2)
   x = data(:,i);
   [y,z,oppt] = buffer([z';x],n,p,opt);
   if i <= 3
       disp(' '), i, ifrm = [z';x]', opts = [opt oppt], y, z, disp(' ')
   end
   opt = oppt;
end
 
i = 1
ifrm = 1×11

     1     2     3     4     5     6     7     8     9    10    11

opts = 1×2

     1     2

y = 4×2

     2     8
     3     9
     4    10
     5    11

z =

  1x0 empty double row vector

 
 
i = 2
ifrm = 1×14

    20    21    22    12    13    14    15    16    17    18    19    20    21    22

opts = 1×2

     2     0

y = 4×1

    14
    15
    16
    17

z = 1×3

    20    21    22

 
 
i = 3
ifrm = 1×13

    32    33    23    24    25    26    27    28    29    30    31    32    33

opts = 1×2

     0     0

y = 4×2

    20    26
    21    27
    22    28
    23    29

z = 1×2

    32    33

 

入力引数

すべて折りたたむ

入力信号。ベクトルで指定します。

フレーム長。正の実数スカラーとして指定します。

サンプル数。実数の正のスカラーとして指定します。

  • 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)) です。

オプション。ベクトルまたは整数として指定します。

  • 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 の 1 つの列に対応します。この行列は、nceil(L/n) 列になります。Ln で割り切れない場合、最後の列には長さが n になるようにゼロが付加されます。

  • y がオーバーラッピング バッファーの場合、nm 列の行列になります。ここで、length(opt) = p のときは m = floor(L/(n-p))opt = 'nodelay' のときは m = ceil((L-p)/(n-p)) です。

  • 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) です。

  • y がオーバーラッピング バッファーの場合、またはオーバーラップのないバッファーの場合、z は、x と同じ方向 (列方向または行方向) になります。

  • y がアンダーラッピング バッファーの場合、z は行ベクトルとして返されます。

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

最後の p 個のサンプル。ベクトルとして返されます。アンダーラップ バッファーの場合、opt は、フレーム間でスキップする点の総数 (-p) と最後のフレームを埋めた後にスキップ可能だった x 内の点数との差です。一連のバッファー処理では、各処理からの opt 出力が後続のバッファー処理への opt 入力として使用されます。これによって、バッファー間、およびバッファー内のフレーム間で、望ましいフレームのオーバーラップやアンダーラップが維持されます。これが実際にどのように機能するかの例は、連続バッファー処理を参照してください。

  • 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 個の点を次のバッファーの最初のフレームから削除する必要があります。

診断

オーバーラッピング バッファーで、pn または 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 より前に導入

参考