假设使用10,000个样本在20秒内获取原始信号,然后使用两秒钟的滑动窗口(每个窗口约750个样本)进行分割,以获取所有可能的多个随机段,而无需使用连续下重叠缓冲技术。 / p>
raw_sig = sig(:); %Raw signal in vector format%
第一种方法采用了buffer
技术,如下所示:
rdm_seg = buffer(raw_sig, 750, 700);
以上方法可生成正确的片段,每个窗口有750个样本,但是片段的数量受到限制,因为它基于连续重叠缓冲区技术。
第二种方法如下所示:
M = 10*1000; %Number of samples in signal%
K = 750; %Number of samples to be segmented per window
n = 250; %Number of segments to be segmented
idxs=cell2mat(arrayfun(@(i)sort(randperm(M,K)),1:n,'Uniform',0)')';
上面的方法从原始信号中产生所有可能的段数,但是样本与第一种方法有很大的不同,似乎不像第一种方法那样。在第二种方法中,信号似乎已损坏,如下图所示:
我正在寻找 N个样本来分割 M个分段的原始信号,该信号看起来像没有连续重叠技术的第二个子图 strong>。
答案 0 :(得分:1)
buffer
function的第三个参数是重叠量。将此值设置为0,可将信号分成不重叠的段,而不会跳过任何值:
rdm_seg = buffer(raw_sig, 750, 0);
这实际上与
相同rdm_seg = buffer(raw_sig, 750);
因为重叠默认为0。
第二种方法使用randperm
,创建样本索引的随机排列,然后对其进行排序。我不确定目的是什么,但是从逻辑上讲它是随机选择一组样本,而不是连续段。
请注意,在这种情况下,只需重塑矩阵即可复制buffer
所做的事情非常简单。但是首先,我们需要用零填充以使长度均匀可分。
K = 750; % length of each segment
N = ceil(numel(raw_sig) / K); % number of segments
M = N * K; % length of signal we need
rdm_seg = raw_sig; % copy
rdm_seg(M) = 0; % pad with zeros
rdm_seg = reshape(rdm_seg, K, N); % reshape, each column contains K consecutive samples