buffer
将信号向量缓冲到数据帧矩阵中
说明
示例
创建一个包含 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(重叠),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)。因此缓冲区中的第一个值是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)。
最后 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输出在当前缓冲操作是连续缓冲操作序列之一时特别有用。每个缓冲操作的opt输出指定在下一个缓冲操作开始时需要跳过的采样数,以保持从一个缓冲区到下一个缓冲区所需的帧欠叠。如果在填充当前缓冲区的最后一帧后可用于跳过的点数少于p,则剩余的opt个点需要从下一个缓冲区的第一个帧中删除。
诊断
对于重叠缓冲区,当 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.(帧重叠 P 必须小于缓冲区大小 N。初始条件必须指定为长度为 -P 的向量。)
详细信息
在一个连续缓冲操作中,buffer 函数的向量输入表示组成离散信号的帧序列中的一个帧。这些信号帧可以源于基于帧的数据采集过程,或基于帧的算法(如 FFT)内部。
例如,您可能从 A/D 卡以包含 64 个采样的帧形式采集数据。在最简单的情形下,您可以将数据重新缓冲为包含 16 个采样的帧;使用 n = 16 的 buffer 从每个包含 64 个元素的输入帧创建一个包含四个帧的缓冲区。结果是帧大小为 64 的信号已转换成帧大小为 16 的信号;没有添加或删除任何采样。
一般情况下,原始信号帧大小 L 无法被新帧大小 n 整除,此时需要捕获来自最后一帧的溢出并回收到后续缓冲区中。您可以通过使用双输出参量语法以迭代方式对输入 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 的输入和输出。本页上的两个示例说明应如何使用 opt 参数。
扩展功能
用法说明和限制:
输入
p在编译时必须为常量。
此函数完全支持 GPU 数组。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数 (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出另请参阅
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.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 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)