buffer
信号ベクトルをデータ フレームの行列にバッファー
説明
例
各フレームが 10 個のサンプルをもつ、100 個のフレームで構成されるバッファーを作成します。
data = buffer(1:1000,10);
行列 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("Iteration " + i) ifrm = [z;x]' opts = [opt oppt] y z disp("-----------") end opt = oppt; end
Iteration 1
ifrm = 1×11
10 1 2 3 4 5 6 7 8 9 10
opts = 1×2
-5 9
y = 4×3
-5 3 6
1 4 7
2 5 8
3 6 9
z = 10
-----------
Iteration 2
ifrm = 1×12
19 20 11 12 13 14 15 16 17 18 19 20
opts = 1×2
9 18
y = 4×3
9 12 15
10 13 16
11 14 17
12 15 18
z = 2×1
19
20
-----------
Iteration 3
ifrm = 1×10
21 22 23 24 25 26 27 28 29 30
opts = 1×2
18 30
y = 4×4
18 21 24 27
19 22 25 28
20 23 26 29
21 24 27 30
z = 0×1 empty double column vector
-----------
Iteration 4
ifrm = 1×11
40 31 32 33 34 35 36 37 38 39 40
opts = 1×2
30 39
y = 4×3
30 33 36
31 34 37
32 35 38
33 36 39
z = 40
-----------
各フレームが 9 個のサンプルをもつ、100 個のフレームで構成されるバッファーを作成します。
data = buffer(1:900,9);
最初の 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("Iteration "+ i) ifrm = [z';x]' opts = [opt oppt] y z disp("-----------") end opt = oppt; end
Iteration 1
ifrm = 1×11
8 9 1 2 3 4 5 6 7 8 9
opts = 1×2
1 0
y = 4×1
2
3
4
5
z = 1×2
8 9
-----------
Iteration 2
ifrm = 1×9
10 11 12 13 14 15 16 17 18
opts = 1×2
0 1
y = 4×2
8 14
9 15
10 16
11 17
z = 1×0 empty double row vector
-----------
Iteration 3
ifrm = 1×11
26 27 19 20 21 22 23 24 25 26 27
opts = 1×2
1 0
y = 4×1
20
21
22
23
z = 1×2
26 27
-----------
入力引数
入力信号。ベクトルで指定します。
フレーム長。正の整数スカラーで指定します。
オーバーラップまたはアンダーラップするサンプルの数。整数スカラーとして指定します。
0<p<n(オーバーラップ) の場合、関数bufferでは各フレームの最後にある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))です。
オプション。ベクトルまたは整数として指定します。
0<p<n(オーバーラップ) の場合、optによってバッファー内でx(1)の前に挿入する長さpのベクトルが指定されます。このベクトルは "初期条件" とみなすことができ、現在のバッファー処理が、一連の連続バッファー処理のうちの 1 つである場合に必要です。あるバッファーと次のバッファー間で望ましいオーバーラップを維持するために、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)を指定します。このため、バッファーの最初の値は、x(opt+1)になります。既定の設定では、optはアンダーラッピング バッファーに対してはゼロです。このオプションは、現在のバッファー処理が一連の連続バッファー処理のうちの 1 つである場合に特に便利です。あるバッファーと次のバッファーの間で望ましいフレーム アンダーラップを維持するには、
optは、フレーム間でスキップする点の総数 (p) と、bufferへの前の入力でスキップ "可能" な点数の差に等しくなければなりません。前の入力に含まれている点の数が、そのバッファーの最後のフレームを埋めた後にスキップできる点のpよりも少ない場合は、残りのopt個の点を現在のバッファーの最初のフレームから削除する必要があります。これが実際にどのように機能するかの例は、連続バッファー処理を参照してください。
出力引数
データ フレーム。行列として返されます。各データ フレームは、y の 1 つの列に対応します。この行列は、n 行 ceil(L/n) 列になります。L が n で割り切れない場合、最後の列には長さが n になるようにゼロが付加されます。
yがオーバーラッピング バッファーの場合、n行m列の行列になります。ここで、length(opt) = pのときはm = floor(L/(n-p))、opt = "nodelay"のときはm = ceil((L-p)/(n-p))です。yがアンダーラッピング バッファーの場合、n行m列の行列になります。ここで、m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n)です。
残りのサンプル。ベクトルとして返されます。適切なオーバーラッピングまたはアンダーラッピングの処理後の入力ベクトル内のサンプル数が、n 行 m 列のバッファーに格納可能な数を超えた場合、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となります。ここで、右辺のoptはbufferの入力引数、左辺のoptは出力引数です。zは空のベクトルです。ここで、mはバッファー内の列数で、m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p))>=n)になります。出力
zにデータが含まれる場合、アンダーラップ バッファーの出力optは常にゼロです。アンダーラッピング バッファーに対する出力
optは、現在のバッファー処理が一連の連続バッファー処理のうちの 1 つである場合に特に便利です。各バッファー処理からのopt出力では、バッファー間で望ましいフレームのアンダーラップを維持するために、次のバッファー処理を開始する前にスキップするサンプル数が指定されます。現在のバッファーの最後のフレームを埋めた後、スキップできる点がpよりも少ない場合は、残りのopt個の点を次のバッファーの最初のフレームから削除する必要があります。
診断
オーバーラッピング バッファーで、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 パラメーターの使用方法を示します。
拡張機能
使用上の注意および制限:
入力
pはコンパイル時に定数でなければなりません。
この関数は、GPU 配列を完全にサポートします。詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入関数 buffer は、double 以外の入力引数をサポートします。
関数 buffer の C および C++ コードを生成します。この機能を使用するには、MATLAB® Coder™ が必要です。
参考
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)