Signal Processing Toolbox    
buffer

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

表示

詳細

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

y = buffer(x,n,p) は、出力行列の中で、p サンプルを連続的に重ねて出力します。

y = buffer(x,n,p,opt) は、オーバラップしたバッファ内でx(1)の前に設定するサンプルベクトル、または、アンダラップするバッファ内でスキップする初期サンプル数のどちらかを指定します。

[y,z] = buffer(...) は、長さLの信号ベクトルxを、長さnのフレームに分割し、yにフル状態になったフレームのみを出力します。yがオーバラップしているバッファの場合、nm列の行列になります。ここで、mは、

または、

となります。yが、アンダラップバッファの場合、nm列の行列になります。ここで、

入力ベクトル内のサンプル数(適切なオーバラッピングまたはアンダラッピング演算の後)が、設定可能なnm列のバッファの数を超えた場合、xの中の残りのサンプルは、ベクトルzに出力されます。ここで、オーバラッピングバッファは、つぎの長さになります。

または、

そして、アンダラピングバッファの長さは、つぎのようになります。

出力zは、xと同じ方向(列方向または行方向)になります。設定したオーバラップまたはアンダラップをもつバッファがフルになった後、残りの入力がない場合、zは空ベクトルになります。

[y,z,opt] = buffer(...) は、出力optにオーバラッピングしたバッファの最後のpサンプルを出力します。アンダラッピングバッファの場合、optは、フレーム間で行うスキップの総数と最後のフレームを満たした後、スキップできるxの中の点数との差です。

一連のバッファリング演算の中で、個々の演算からのopt出力が、それに続くバッファリング演算への入力として使われています。これは、希望するフレームのオーバラップまたはアンダラップは、同じバッファ内のフレームからフレームで維持されるのと同様に、バッファからバッファへ維持されます。この詳細は、つぎの連続バッファリングを参照してください。

連続バッファリング

連続バッファリング演算において、関数 buffer へのベクトル入力は、離散信号を構成する一連のフレームの中の一つのフレームを表わしています。これらの信号フレームは、フレームベースのデータアグジッションプロセス、またはFFTのようなフレームベースのアルゴリズムの中から生じています。

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

オリジナルのフレームサイズがLで、新しいフレームサイズnで割り切れない一般的な場合、最後のフレームからの余分なデータは、つぎのバッファの中に捕らえられ、再度使われる必要があります。2つの出力引数を使う書式で、入力xbufferを会話形式で呼び出すことにより、このような事柄が可能になります。

これは、簡単に zに任意のバッファオーバフローを捕らえ、bufferをつぎに読み込んだときに、それに続く入力を付加します。再度、フレームサイズLの入力信号xは、フレームサイズnの信号に、サンプルの付加または削除なしに変換されます。

連続的なバッファリングは、単出力書式y = buffer(...)で行うことはできません。この場合は、信号に新しいサンプルを付加するために、yの最後のフレームにゼロが付加されるためです。

オーバラップまたはアンダラップが存在する中で、連続バッファリングは、bufferへの入力、出力として共に使うために、optパラメータと共に使います。つぎの2つの例は、optパラメータの使い方を示すものです。

例題

例題 1: 連続オーバラッピングバッファ

まず、各フレームが11サンプルをもつ100フレームを含むバッファを作成します。

dataと名付けた行列内のフレーム(列)は、物理的な信号をサンプリングしているデータアグジッションボードの連続的な出力と想像してください。すなわち、data(:,1)は、最初の11信号サンプルを含む最初のD/A出力で、data(:,2)は、つぎの11信号サンプルを含む2番目の出力と、等々と想像してください。

このデータを11の処理するフレームサイズからオーバラップが1サンプルでフレームサイズが4になるように再バッファリングしましょう。これを行うには、個々の連続的な入力フレームに機能するように、あるバッファがつぎのバッファとのオーバラップに矛盾しないようにoptパラメータを使って、bufferを繰り返し呼び出します。

バッファパラメータを設定します。

繰り返しbufferを読み込み、データから新しい信号フレーム内に書く時刻で読み込まれます。オーバラップサンプル(zに出力されます)は持ち越され、bufferへのつぎの入力に付加されます。

つぎに、最初の4回の繰り返しでどのようなことが生じるかを示します。

出力行列yの大きさは、一つの繰り返しからつぎの繰り返しまでの単一の列により変化することに注意してください。これは、オーバラップまたはアンダラップをもったバッファリング演算の典型的なものです。

例題 2: 連続的なアンダラッピングバッファ

再度、1フレーム11サンプルで、100フレームを含む1つのバッファを作成します。

また、data(:,1)は最初のD/A出力で、最初の11信号サンプルを含み、data(:,2)は2番目の出力で、つぎの11サンプルを含み、等々と想像してください。

1フレーム11サンプルの信号を1フレーム4サンプルでアンダラッピングが2に再バッファしたいとします。これを行うため、あるバッファからつぎのバッファまでのアンダラッピングに矛盾が生じないように、 opt パラメータを使って、各々連続的な入力フレームに buffer を繰り返し読み込みます。

バッファのパラメータを設定します。

データから新しい信号フレームに転送するためにbufferを繰り返し読み込みます。(zに出力される)オーバフローサンプルがつぎに持ち越され、つぎに読み込まれるbufferへの入力に付加されます。

つぎに、最初の3回の繰り返しでの状態を示します。

診断

オーバラッピングバッファの場合、 pnまたはlength(opt)length(p)のとき、つぎのエラーメッセージが表示されます。

参考
reshape
配列の整形


 boxcar buttap