MATLAB中buffer函数的功能是将信号向量缓冲到数据帧矩阵中,本文主要对其实现进行介绍,主要参考Buffer signal vector into matrix of data frames。
1.调用语句
y = buffer(x,n)
y = buffer(x,n,p)
y = buffer(x,n,p,opt)
[y,z] = buffer(___)
[y,z,opt] = buffer(___)
2.具体介绍
2.1 y = buffer(x,n)
y = buffer(x,n) 将长度为L的信号向量x划分为长度为n的非重叠数据段(帧)。以下代码创建一个包含100帧的缓冲数据,每个帧包含11个样本,最终得到的y为 11 ∗ 100 11*100 11∗100的矩阵。
y = buffer(1:1100,11)
2.2 y = buffer(x,n,p)
y = buffer(x,n,p) 在输出矩阵中将连续的帧重叠或跳过p个样本。
对于 0 < p < n 0<p<n 0<p<n(重叠),缓冲区在下一帧的开头重复每个帧的最后p个样本。例如,如果 x = 1 : 30 x = 1:30 x=1:30且 n = 7 n = 7 n=7,则 p = 3 p = 3 p=3的重叠如下图所示,前后都加0,中间的黄色为重叠区域。第一帧以p个零开始(默认初始条件),并且y中的列数为 c e i l ( L / ( n − p ) ) ceil(L/(n-p)) ceil(L/(n−p)),ceil为向上取整。因此,最终得到 7 ∗ 8 7*8 7∗8的矩阵。
y = buffer(1:30,7,3)
对于
p
<
0
p <0
p<0(跳过),缓冲区在连续帧之间跳过p个样本。 例如,如果
x
=
1
:
30
x = 1:30
x=1:30且
n
=
7
n = 7
n=7,则下重叠为
p
=
−
3
p = -3
p=−3的缓冲数据如下图所示,右侧的skipped黄色部分为跳过的样本,这里y中的列数也是
c
e
i
l
(
L
/
(
n
−
p
)
)
ceil(L/(n-p))
ceil(L/(n−p))。
y = buffer(1:30,7,-3)
2.3 y = buffer(x,n,p,opt)
y = buffer(x,n,p,opt) specifies a vector of samples to precede x(1) in an overlapping buffer, or the number of initial samples to skip in an underlapping buffer.
指定重叠缓冲区中x(1)之前的样本向量,或指定下重叠缓冲区中要跳过的初始样本数。
对于 0 < p < n 0 <p <n 0<p<n(重叠),opt指定要在缓冲区x(1)之前插入的length-p向量。该向量可以被认为是初始条件,当当前缓冲操作是连续缓冲操作序列中的一个时,需要此向量。为了保持从一个缓冲区到下一个缓冲区的所需帧重叠,opt应该包含序列中前一个缓冲区的最后p个样本。具体请参见连续缓冲。
默认情况下,对于重叠缓冲区,opt为 z e r o ( p , 1 ) zero(p,1) zero(p,1)。将opt设置为“ nodelay”可跳过初始条件,并立即开始用x(1)填充缓冲区。在这种情况下,L必须为length§或更长。例如,如果 x = 1 : 30 x = 1:30 x=1:30且 n = 7 n = 7 n=7,则重叠为 p = 3 p = 3 p=3的缓冲区看如下所示。
y = buffer(1:30,7,3,'nodelay')
对于p <0(跳过),opt是[0,-p]范围内的整数,指定在将样本添加到缓冲区之前要跳过的初始输入样本数x(1:opt)。 因此,缓冲区中的第一个值是x(opt + 1)。 默认情况下,对于底层缓冲区,opt为零。
当当前缓冲操作是一系列连续缓冲操作中的一个时,此选项特别有用。 为了保持从一个缓冲区到下一个缓冲区的所需帧重叠,opt应该等于帧之间要跳过的点总数(p)与在缓冲区的先前输入中可以跳过的点数量之差。 如果在填充该缓冲区的最后一帧后,先前的输入少于p个可以跳过的点,则需要从当前缓冲区的第一帧中删除其余的选择点。 有关如何在实际中工作的示例,参见连续缓冲。
2.4 [y,z] = buffer(___)
[y,z] = buffer(___) 将长度为L的信号矢量x划分为长度为n的帧,并仅输出y中的完整帧。 向量z包含其余样本。 该语法可以包括前面输入参数的任意组合。
2.5 [y,z,opt] = buffer(___)
[y,z,opt] = buffer(___) 返回输出opt中重叠缓冲区的最后p个样本。
3.输入参数Input Arguments
3.1 输入信号x
x — Input signal
vector
Input signal, specified as a vector.
输入信号,指定为向量
3.2 帧数n
n — Frame length
positive real scalar
Frame length, specified as a positive real scalar.
帧的个数,指定为正实标量
3.3 样本个数p
p — Number of samples
positive real scalar
Number of samples, specified as a real positive scalar.
样本数量,指定为实数正标量
3.4 指定选项opt
opt — Option
zeros(p,1) (default) | 'nodelay' | vector | integer
Option, specified as a vector or integer.
选项,指定为向量或整数
4.输出参数Output Arguments
4.1 数据帧矩阵
y — Data frame
matrix
数据帧,以矩阵形式返回。每个数据帧占用y的一列,该列具有n行和 c e i l ( L / n ) ceil(L/n) ceil(L/n)列。 如果L不能被n整除,则最后一列用零填充到长度n。对于重叠或跳过操作,矩阵的列数m需要另行计算,如下所示:
p>0 且 length(opt) = p 时, m = floor(L/(n-p))
p>0 且 opt = 'nodelay' 时, m = ceil((L-p)/(n-p))
p<0 且 length(opt) = p 时, m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n).
4.2 剩余样本
z — Remaining samples
vector
剩余样本作为向量返回。 如果输入向量中的样本数(在适当的重叠或下重叠运算之后)超过了n×m缓冲区中可用的位置数,则x中的其余样本将在向量z中输出。z具有与x相同的方向(行或列)。 如果在填充具有指定重叠或下重叠的缓冲区之后输入中没有剩余样本,则z为空向量。
4.3 最后p个样本
opt — Last p samples
vector
最后p个样本,作为向量返回。在下缓冲缓冲区中,opt是帧之间要跳过的总点数(-p)与填充最后一帧后x中可以跳过的点数之差。在一系列缓冲操作中,每个操作的opt输出都应用作后续缓冲操作的opt输入。这确保了在缓冲器之间以及在同一缓冲器内的帧与帧之间保持期望的帧重叠或欠重叠。 有关如何在实际中工作的示例,请参见连续缓冲。
5.诊断程序
在重叠缓冲区的情况下,当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.
6.连续缓冲Continuous Buffering
在连续缓冲操作中,输入到缓冲函数的向量代表组成离散信号的一系列帧中的一个帧。这些信号帧可以源自基于帧的数据采集过程,也可以源自诸如FFT的基于帧的算法。
例如,以64个样本的帧数从A/D卡获取数据。 在最简单的情况下,可以将数据重新缓冲为16个样本的帧。n = 16的buffer从每个64元素的输入帧中创建四个帧的缓冲区。结果是帧大小为64的信号已转换为帧大小为16的信号;而且没有添加或删除样本。
在原始信号帧大小L无法被新帧大小n整除的一般情况下,需要捕获来自最后一帧的溢出并将其循环到以下缓冲区中。 您可以通过使用two-output-argument语法在输入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中的任何缓冲区溢出,并在下一次对缓冲区的调用中将数据添加到后续输入中。同样,帧大小为L的输入信号x已被转换为帧大小为n的信号,而没有任何样本的插入或删除。
请注意,无法使用单输出语法y = buffer(…)来进行连续缓冲,因为在这种情况下y的最后一帧填充为零,这会向信号中添加新的样本。
存在重叠和跳跃的连续缓冲由opt参数处理,该参数既用作缓冲区的输入又用作输出。原页面上的两个示例演示了如何使用opt参数。