在matlab中创建方波以覆盖数据集

Creating a square wave to overlay data set in matlab

在 Matlab 中,我试图实现以下目标:

我有一个数据集,该数据集在生物学上代表了给予刺激时大脑中的激活。所以数据是这样的,我们有 9 个刺激数据点,然后是 15 个休息数据点,它一直这样持续大约 300 个数据点(实时 4 分钟)。

我可以很容易地绘制数据,但我试图叠加一个方波,它代表 "stimuluation" 的时间,这样只要看一下图表就很容易看出哪个是休息时间和刺激。

很简单,我创建了一个向量 X 并使其成为(前 3 个点应该是 0)

  X = [0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 
 0 0 0 0 0 0 0] 

并将其绘制在与数据相同的图表上。它工作正常,但问题是我需要根据我的时间尺度自动创建 X。

Total_time = [-3:1.5:302]

这是我的总时间范围,从-3到302秒,采样率为1.5s。前3点 -3、-1.5、0 是休息时间。然后从 0 秒开始,刺激开始大约 9 秒(这将在 9 秒的时间内产生 6 个数据点)。

所以我的问题是 - 是否可以使用某种 for 循环来创建此向量 X 来说明从 0 X = 1 开始的 6 个数据点和接下来的 10 个 X = 0?我在想以下几点:

X = zeros(1,304) %to create a 1x304 vector of zeros 
X(0:3)=0
X(3:9)=1
X(9:19)=0

但话又说回来..这是手写的。

有人可以帮忙吗?

谢谢!

模运算很容易:

m = 3;   %// initial low period
n = 6;   %// high period
p = 10;  %// low period
s = 304; %// x size

x = [zeros(1,m) mod(0:s-m-1, n+p)<n];

结果(第一个值):

0  0  0  1  1  1  1  1  1  0  0  0  0  0  0  0  0  0  0  1  1  1  1  1  1  0  0 ...

请注意,如果需要,np 可以是 非整数 。例如,如果高电平持续 5 秒,而您的采样周期为 1.5 秒,则只需定义 n=5/1.5,即

0  0  0  1  1  1  1  0  0  0  0  0  0  0  0  0  0  1  1  1  0  0  0  0  0  0  0 ...

可以看出,高周期持续 4 或 3 个样本以容纳非整数 n

正如您已经告诉我们的那样:您所拥有的是一个重复的模式。 在你的例子中,模式是向量

pattern = [zeros(1,3) ones(1,9) zeros(1,15-3)];

因此您可以通过使用 repmat:

复制此向量来生成信号
startTime = -3;
endTime = 302;
timeStep = 1.5;

%%// Computation
time = startTime:timeStep:endTime;
numPatterns = ceil(length(time)/length(pattern));
X = repmat(pattern, 1, numPatterns);
%// As the pattern will end after endTime, we remove everything beyond endTime
X(length(time)+1:end) = []; 

%%// Plot
plot(time, X);