主要内容

buffer

将信号向量缓冲到数据帧矩阵中

说明

y = buffer(x,n) 将一个长度为 L 的信号 x 分成若干个长度为 n 的不重叠数据段(帧)。

y = buffer(x,n,p) 在输出矩阵中的连续帧之间重叠或欠叠 p 个采样。

y = buffer(x,n,p,opt) 指定在重叠缓冲区中位于 x(1) 之前的采样向量,或指定在欠叠缓冲区中要跳过的初始采样数。

示例

[y,z] = buffer(___) 将一个长度为 L 的信号 x 分成若干个长度为 n 的帧,并仅在 y 中输出完整帧。向量 z 包含剩余的采样。此语法可以包括上述语法中输入参量的任意组合。

示例

[y,z,opt] = buffer(___) 在输出 opt 中返回重叠缓冲区的最后 p 个采样。

示例

全部折叠

创建一个包含 100 个帧的缓冲区,每帧有 10 个采样。

data = buffer(1:1000,10);

将矩阵 data 中的帧(列)视为数据采集板对物理信号采样的顺序输出:data(:,1) 是第一个 A/D 输出,包含前 11 个信号采样,data(:,2) 是第二个输出,包含接下来的 11 个信号采样,依此类推。

您要对此信号进行重新缓冲,即从采集的帧大小为 11 改成帧大小为 4,重叠为 1。调用 buffer 对每个连续输入帧进行操作,使用 opt 参数来保持从一个缓冲区到下一个缓冲区的重叠一致性。

设置缓冲区参数。为 y(1) 指定值 -5。结转向量最初为空。

n = 4;
p = 1;
opt = -5;
z = [];

现在重复调用 buffer,每次从 data 传入一个新信号帧(列)。溢出采样(在 z 中返回)会结转并在后续调用 buffer 时前追加到输入中。

对于前四次迭代,显示输入帧 [z;x]'opt 的输入和输出值、输出缓冲区 y 和溢出 z。输出矩阵 y 的大小在每次迭代中可能有一列发生变化。对于具有重叠或欠叠的缓冲操作,这是典型行为。

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
-----------

创建一个包含 100 个帧的缓冲区,每帧有 9 个采样。

data = buffer(1:900,9);

data(:,1) 作为第一个 A/D 输出,包含前 11 个信号采样,data(:,2) 作为第二个输出,包含接下来的 11 个信号采样,依此类推。

您要对此信号进行重新缓冲,即从采集的帧大小为 11 改成帧大小为 4,欠叠为 2。为此,您将重复调用 buffer 对每个连续输入帧进行操作,使用 opt 参数来保持从一个缓冲区到下一个缓冲区的欠叠一致性。

设置缓冲区参数。指定新帧大小为 4,欠叠为 -2。通过设置 opt 为 1,跳过第一个输入元素 x(1)。结转向量最初为空。

n = 4;
p = -2;
opt = 1;
z = [];

现在重复调用 buffer,每次从 data 传入一个新信号帧(列)。溢出采样(在 z 中返回)会结转并在后续调用 buffer 时前追加到输入中。

对于前三次迭代,显示输入帧 [z';x]'opt 的输入和输出值、输出缓冲区 y 和溢出 z。输出矩阵 y 的大小在每次迭代中可能有一列发生变化。对于具有重叠或欠叠的缓冲操作,这是典型行为。

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:30n = 7,重叠 p = 3,如下所示。

    第一个帧以 p 个零开始(默认初始条件),且 y 中的列数为 ceil(L/(n-p))

  • 对于 p < 0(欠叠),buffer 在连续帧之间跳过 p 个采样。例如,如果 x = 1:30n = 7,缓冲区欠叠为 p = -3,如下所示。

    y 中的列数为 ceil(L/(n-p))

选项,指定为向量或整数。

  • 对于 0 < p < n(重叠),opt 指定在缓冲区中的 x(1) 之前插入一个长度为 p 的向量。此向量可视为初始条件,在当前缓冲操作是连续缓冲操作序列之一时需要此初始条件。为了保持从一个缓冲区到下一个缓冲区所需的帧重叠,opt 应包含序列中前一个缓冲区的最后 p 个采样。请参阅下面的连续缓冲

    默认情况下,对于重叠缓冲区,optzeros(p,1)。将 opt 设置为 "nodelay" 可跳过初始条件并立即开始用 x(1) 填充缓冲区。在这种情况下,L 必须为 length(p) 或更长。例如,如果 x = 1:30n = 7,缓冲区重叠为 p = 3,如下所示。

  • 对于 p < 0(欠叠),opt 是范围 [0,-p] 中的一个整数值,指定在将采样添加到缓冲区之前要跳过的初始输入采样数 x(1:opt)。因此缓冲区中的第一个值是 x(opt+1)。默认情况下,对于欠叠缓冲区,opt 为零。

    此选项在当前缓冲操作是连续缓冲操作序列之一时特别有用。为了保持从一个缓冲区到下一个缓冲区所需的帧欠叠,opt 应等于帧之间要跳过的总点数 (p) 与在 buffer 的前一个输入中可用于跳过的点数之差。如果前一个输入在填充该缓冲区的最后一帧后可用于跳过的点数少于 p,则剩余的 opt 个点需要从当前缓冲区的第一个帧中删除。请参阅连续缓冲以了解其在实践中如何工作的示例。

输出参量

全部折叠

数据帧,以矩阵形式返回。每个数据帧占据 y 的一列,该矩阵有 n 行和 ceil(L/n) 列。如果 L 无法被 n 整除,最后一列将用零填充到长度 n

  • 如果 y 是重叠缓冲区,它有 n 行和 m 列,其中 m = floor(L/(n-p))(当 length(opt) = p 时)或 m = ceil((L-p)/(n-p))(当 opt = "nodelay" 时)。

  • 如果 y 是欠叠缓冲区,它有 n 行和 m 列,其中 m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n)

剩余采样,以向量形式返回。如果输入向量中的采样数(在适当的重叠或欠叠操作后)超过 n×m 缓冲区中的可用位置,则 x 中的剩余采样在向量 z 中输出,对于重叠缓冲区,当 L - m*(n-p) 时长度为 length(opt) = p,当 L - ((m-1)*(n-p)+n) 时长度为 opt = "nodelay";对于欠叠缓冲区,长度为 (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,其中右边的 optbuffer 的输入参量,左边的 opt 是输出参量。z 是空向量。此处 m 是缓冲区中的列数,且 m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p))>=n)

    请注意对于欠叠缓冲区输出,当输出 z 包含数据时,opt 始终为零。

    欠叠缓冲区的 opt 输出在当前缓冲操作是连续缓冲操作序列之一时特别有用。每个缓冲操作的 opt 输出指定在下一个缓冲操作开始时需要跳过的采样数,以保持从一个缓冲区到下一个缓冲区所需的帧欠叠。如果在填充当前缓冲区的最后一帧后可用于跳过的点数少于 p,则剩余的 opt 个点需要从下一个缓冲区的第一个帧中删除。

诊断

对于重叠缓冲区,当 pnlength(opt)length(p) 时显示错误消息:

Frame overlap P must be less than the buffer size N.
Initial conditions must be specified as a length-P vector.(帧重叠 P 必须小于缓冲区大小 N。初始条件必须指定为长度为 -P 的向量。)

详细信息

全部折叠

扩展功能

全部展开

版本历史记录

在 R2006a 之前推出

全部展开

另请参阅