このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
buffer
信号ベクトルをデータ フレームの行列にバッファー
説明
例
連続オーバーラッピング バッファー
各フレームが 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
入力引数
x
— 入力信号
ベクトル
入力信号。ベクトルで指定します。
n
— フレーム長
正の整数スカラー
フレーム長。正の整数スカラーで指定します。
p
— サンプル数
整数スカラー
サンプル数。整数スカラーとして指定します。
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))
です。
opt
— オプション
zeros(p,1)
(既定値) | "nodelay"
| ベクトル | 整数
オプション。ベクトルまたは整数として指定します。
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
— データ フレーム
行列
データ フレーム。行列として返されます。各データ フレームは、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)
です。
z
— 残りのサンプル
ベクトル
残りのサンプル。ベクトルとして返されます。適切なオーバーラッピングまたはアンダーラッピングの処理後の入力ベクトル内のサンプル数が、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
は空ベクトルになります。
opt
— 最後の p
個のサンプル
ベクトル
最後の 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
パラメーターの使用方法を示します。
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
入力
p
はコンパイル時に定数でなければなりません。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
この関数は、GPU 配列を完全にサポートします。詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入R2023b: double 以外の入力引数の使用
関数 buffer
は、double 以外の入力引数をサポートします。
R2023a: C および C++ コードの生成
関数 buffer
の C および C++ コードを生成します。この機能を使用するには、MATLAB® Coder™ が必要です。
参考
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)