在Matlab中具有固定窗口大小的随机信号分割

时间:2018-07-24 07:05:17

标签: matlab signals

假设使用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)')';

上面的方法从原始信号中产生所有可能的段数,但是样本与第一种方法有很大的不同,似乎不像第一种方法那样。在第二种方法中,信号似乎已损坏,如下图所示:

  1. 原始信号
  2. 第一种方法结果
  3. 第二种方法结果

enter image description here

我正在寻找 N个样本来分割 M个分段的原始信号,该信号看起来像没有连续重叠技术的第二个子图 strong>。

1 个答案:

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