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)