| Signal Processing Toolbox | ![]() |
表示
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の一つの列に対応します。この行列は、n行ceil(L/n)列になります。Lがnで割り切れない場合、最後の列には、長さがnになるようにゼロが付加されます。
y = buffer(x,n,p)
は、出力行列の中で、p サンプルを連続的に重ねて出力します。
0<p<n(オーバラップ)に対して、bufferは、あるフレームに関して、その最後のpサンプルが、つぎのフレームの最初のpサンプルと同じものを繰り返して使います。たとえば、x = 1:30で n = 7の場合、p = 3で設定したオーバラップは、つぎのようになります。
最初のフレームは、p個のゼロ(デフォルト初期条件)から始まります。そして、yの列数は、ceil(L/(n-p))になります。
p<0(アンダラップ)に対して、 buffer は、あるフレームの最後の要素から p サンプルスキップしたものが、つぎのフレームの最初の要素になります。たとえば、x = 1:30 でn = 7に対して、p = -3 のアンダラップをもつバッファは、つぎのようになります。
yの列の数は、ceil(L/(n-p))になります。
y = buffer(x,n,p,opt)
は、オーバラップしたバッファ内でx(1)の前に設定するサンプルベクトル、または、アンダラップするバッファ内でスキップする初期サンプル数のどちらかを指定します。
0<p<n (オーバラップ)の場合、opt は、バッファ内でx(1)の前に挿入する長さpのベクトルを指定します。このベクトルは、初期条件と考えられ、現在のバッファリング演算が、連続的に行われるバッファリング演算の最初の部分であるときに必要になります。あるバッファからつぎのバッファをオーバラップするようなフレームを取り扱いたい場合、optには、一連の中で、前のバッファの最後のpサンプルを設定してください。詳細は、つぎの 連続バッファリングを参照してください。 opt は、オーバラッピングバッファに対して、 zeros(p,1) です。 opt に 'nodelay' を設定すると、初期条件をスキップして、 x(1) からバッファリングが始まります。この場合、 L は length(p) または、それより長くなければなりません。たとえば、 x = 1:30 で n = 7 に対して、 p = 3 のオーバラップをもつバッファは、つぎのようになります。
p<0(アンダラップ)に対して、optは初期入力サンプル数を設定する[0,-p] の範囲の整数値です。ここで、x(1:opt)が、このサンプル数に対応し、バッファリングを始める前にスキップするものです。デフォルトでは、optはアンダラッピングバッファに対してゼロです。 このオプションは、カレントのバッファリング演算が、連続的に行われるバッファリング演算の中の一つとなるときに、特に有効です。あるバッファからつぎのバッファへ希望するフレームアンダラッピングを維持するには、optはフレーム間でスキップする点の総数とバッファを行うために前の入力の中でスキップされる可能な点数との間の差に等しくなければなりません。前の入力が、そのバッファの最後のフレームを一杯にした後スキップできる点数pよりも短い場合、残っているopt点は、カレントのバッファの最初のフレームから取り除く必要があります。実際に、この機能がどのように働くかについては、連続バッファリングを参照してください。
[y,z] = buffer(...)
は、長さLの信号ベクトルxを、長さnのフレームに分割し、yにフル状態になったフレームのみを出力します。yがオーバラップしているバッファの場合、n行m列の行列になります。ここで、mは、
m = floor(L/(n-p)) % (length(opt) = p のとき)
m = floor((L-n)/(n-p))+1 % (opt = 'nodelay' のとき)
となります。yが、アンダラップバッファの場合、n行m列の行列になります。ここで、
m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n)
入力ベクトル内のサンプル数(適切なオーバラッピングまたはアンダラッピング演算の後)が、設定可能なn行m列のバッファの数を超えた場合、xの中の残りのサンプルは、ベクトルzに出力されます。ここで、オーバラッピングバッファは、つぎの長さになります。
length(z) = L - m*(n-p) % length(opt) = p のとき
length(z) = L - ((m-1)*(n-p)+n) % opt = 'nodelay' のとき
そして、アンダラピングバッファの長さは、つぎのようになります。
length(z) = (L-opt) - m*(n-p)
出力zは、xと同じ方向(列方向または行方向)になります。設定したオーバラップまたはアンダラップをもつバッファがフルになった後、残りの入力がない場合、zは空ベクトルになります。
[y,z,opt] = buffer(...)
は、出力optにオーバラッピングしたバッファの最後のpサンプルを出力します。アンダラッピングバッファの場合、optは、フレーム間で行うスキップの総数と最後のフレームを満たした後、スキップできるxの中の点数との差です。
0<p<n (オーバラップ)に対して、 出力optは、バッファの最新のフレーム内の最後の pサンプルを含んでいます。このベクトルは、連続的なバッファリング演算の一連の作業の中で、それに続くバッファリング演算に対する初期条件として使われます。これは、あるバッファからつぎのバッファに維持されなければならないようなフレームのオーバラッピングに使われます。詳細は、"連続バッファリング"を参照してください。p<0(アンダラップ)に対して、出力optは、フレーム間のスキップする点の総数と最後のフレームが一杯になった後、スキップできるx内の点数の差になります。opt = m*(n-p) + opt - L % z is the は空ベクトル
ここで、右辺のoptは、バッファリングされる入力引数で、左辺のoptは出力引数です。ここで、mは、バッファの中の列数で、つぎのようになります。
m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p))>=n)
アンダラッピングに対して、出力zがデータを含んでいるとき、出力optは常にゼロです。
アンダラッピングバッファに対する出力 opt は、カレントのバッファリング演算が連続的に続いているバッファリング演算の一つの場合、特に有効です。各バッファリング演算からのopt出力は、あるバッファからつぎのバッファまで希望するフレームアンダラップを維持するため、つぎのバッファリング演算が始まるまでにスキップする必要のあるサンプル数を設定します。カレントバッファの最終的なフレームをフルにした後、スキップできる点が、p点よりも少ない場合、残りのopt点が、つぎのバッファの最初のフレームから取り除かれる必要があります。
一連のバッファリング演算の中で、個々の演算からのopt出力が、それに続くバッファリング演算への入力として使われています。これは、希望するフレームのオーバラップまたはアンダラップは、同じバッファ内のフレームからフレームで維持されるのと同様に、バッファからバッファへ維持されます。この詳細は、つぎの連続バッファリングを参照してください。
連続バッファリング
連続バッファリング演算において、関数 buffer へのベクトル入力は、離散信号を構成する一連のフレームの中の一つのフレームを表わしています。これらの信号フレームは、フレームベースのデータアグジッションプロセス、またはFFTのようなフレームベースのアルゴリズムの中から生じています。
例として、64サンプル1フレームのA/Dカードを使って、データを取得しているとしましょう。最も簡単な場合、16サンプル1フレームにデータを再バッファすることができます。すなわち、n=16と設定して、bufferを使うと、各64要素の入力フレームから4フレームのバッファが作成できます。結果は、フレームサイズ64の信号は、フレームサイズ16の1つの信号に変換されます。ここでは、サンプルの付加も削除もありません。
オリジナルのフレームサイズがLで、新しいフレームサイズnで割り切れない一般的な場合、最後のフレームからの余分なデータは、つぎのバッファの中に捕らえられ、再度使われる必要があります。2つの出力引数を使う書式で、入力xにbufferを会話形式で呼び出すことにより、このような事柄が可能になります。
[y,z]=buffer([z;x],n) % 列ベクトルxに対して [y,z]=buffer([z,x],n) % 行ベクトルxに対して
これは、簡単に zに任意のバッファオーバフローを捕らえ、bufferをつぎに読み込んだときに、それに続く入力を付加します。再度、フレームサイズLの入力信号xは、フレームサイズnの信号に、サンプルの付加または削除なしに変換されます。
連続的なバッファリングは、単出力書式y = buffer(...)で行うことはできません。この場合は、信号に新しいサンプルを付加するために、yの最後のフレームにゼロが付加されるためです。
オーバラップまたはアンダラップが存在する中で、連続バッファリングは、bufferへの入力、出力として共に使うために、optパラメータと共に使います。つぎの2つの例は、optパラメータの使い方を示すものです。
例題 1: 連続オーバラッピングバッファ
まず、各フレームが11サンプルをもつ100フレームを含むバッファを作成します。
data = buffer(1:1100,11); % フレームあたり11 サンプル
dataと名付けた行列内のフレーム(列)は、物理的な信号をサンプリングしているデータアグジッションボードの連続的な出力と想像してください。すなわち、data(:,1)は、最初の11信号サンプルを含む最初のD/A出力で、data(:,2)は、つぎの11信号サンプルを含む2番目の出力と、等々と想像してください。
このデータを11の処理するフレームサイズからオーバラップが1サンプルでフレームサイズが4になるように再バッファリングしましょう。これを行うには、個々の連続的な入力フレームに機能するように、あるバッファがつぎのバッファとのオーバラップに矛盾しないようにoptパラメータを使って、bufferを繰り返し呼び出します。
n=4; % 新しいフレームサイズ p=1; % オーバラップ opt=-5; % y(1)の値 z=[]; % carry-overベクトルの初期化
繰り返しbufferを読み込み、データから新しい信号フレーム内に書く時刻で読み込まれます。オーバラップサンプル(zに出力されます)は持ち越され、bufferへのつぎの入力に付加されます。
for i=1:size(data,2), % 各ソースフレームについて繰り返し x=data(:,i); % D/A出力の単一フレーム [y,z,opt]=buffer([z;x],n,p,opt); disp(y); % バッファしたデータを表示 pause end
つぎに、最初の4回の繰り返しでどのようなことが生じるかを示します。

出力行列yの大きさは、一つの繰り返しからつぎの繰り返しまでの単一の列により変化することに注意してください。これは、オーバラップまたはアンダラップをもったバッファリング演算の典型的なものです。
例題 2: 連続的なアンダラッピングバッファ
再度、1フレーム11サンプルで、100フレームを含む1つのバッファを作成します。
data = buffer(1:1100,11); % 1フレーム11サンプル
また、data(:,1)は最初のD/A出力で、最初の11信号サンプルを含み、data(:,2)は2番目の出力で、つぎの11サンプルを含み、等々と想像してください。
1フレーム11サンプルの信号を1フレーム4サンプルでアンダラッピングが2に再バッファしたいとします。これを行うため、あるバッファからつぎのバッファまでのアンダラッピングに矛盾が生じないように、 opt パラメータを使って、各々連続的な入力フレームに buffer を繰り返し読み込みます。
n=4; % 新しいフレームサイズ p=-2; % アンダラップ opt=1; % 最初の要素x(1)をスキップ z=[]; % 持ち越しベクトルの初期化
データから新しい信号フレームに転送するためにbufferを繰り返し読み込みます。(zに出力される)オーバフローサンプルがつぎに持ち越され、つぎに読み込まれるbufferへの入力に付加されます。
for i=1:size(data,2), % 各ソースフレームに渡る繰り返し x=data(:,i); % D/A出力の単一フレーム [y,z,opt]=buffer([z;x],n,p,opt); disp(y); % データのバッファを表示 pause end
診断
オーバラッピングバッファの場合、 p
nまたはlength(opt)
length(p)のとき、つぎのエラーメッセージが表示されます。
Frame overlap P must be less than the buffer size N. Initial conditions must be specified as a length-P vector.
参考
|
配列の整形 |
| boxcar | buttap | ![]() |