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 | ![]() |