以每秒300个样本记录'爆发'样本

时间:2014-05-20 22:01:50

标签: matlab

我正在小电路上记录电压变化 - 这记录了鼠标进给。当鼠标进食时,电路电压发生变化,我将其转换为1和0,一切都很好。

但是我想计算喂食的“爆发”的数量和持续时间 - 即,在250毫秒(75个样本)内发生电路关闭的情况。如果关闭之间的差距大于250毫秒,我想把它算作一个新的'爆发'

我想我正在寻求帮助,要求matlab将数字文件中每个1的样本编号与下一个1的样本编号进行比较 - 如果差异大于75,则调用第一个1结束一个回合,第二回合是另一回合的开始,将差异分类为差距,但如果不是,则保留前1的样本编号并将其与下一个和下一个和下一个进行比较,直到有75个样本差

我可以将每个1与下一个1进行比较:

n=1; m=2;
for i = 1:length(bouts4)-1

if bouts4(i+1) - bouts4(i) >= 75 %250 msec gap at a sample rate of 300
boutend4(n) = bouts4(i);
boutstart4(m)= bouts4(i+1);
m = m+1;
n = n+1;
end

我真的不想为两个变量迭代i ...

任何想法??

-DB

2 个答案:

答案 0 :(得分:1)

实际上并不太糟糕。我们实际上可以完全向量化。首先,让我们从两个信号开始:

  1. 未触及的电压版本
  2. 电压版本在时间上移动1步(即从时间索引= 2开始)。
  3. 现在基本算法真的是:

    1. 浏览每个元素,看看差异是否高于阈值(在您的情况下为75)。
    2. 枚举每个阵列的位置
    3. 现在进入代码!

      %// Make those signals
      bout4a = bouts4(1:end-1);
      bout4b = bouts4(2:end);
      
      %// Ensure column vectors - you'll see why soon
      bout4a = bout4a(:);
      bout4b = bout4b(:);
      
      % // Step #1
      loc = find(bouts4b - bouts4a >= 75);
      % // Step #2
      boutend4 = [bouts4(loc); 0];
      boutstart4 = [0; bouts4(loc + 1)];
      

      除了:

      感谢tail.b.lo,您也可以使用diff。它基本上像我之前那样复制那些矢量来执行差异操作。 diff基本上以相同的方式工作。但是,我决定不使用它,因此您可以看到您编写的代码是如何以矢量化方式转换的。唯一的学习方法吧?

      回到它!

      让我们慢慢走过这一步。前两行代码就是我所说的那些信号。一个原始的(最多length(bouts) - 1)和另一个长度相同但移过一次索引的。接下来,我们使用find查找时间索引为>= 75的时间段。之后,我们使用这些位置来访问bouts数组。结束数组访问原始数组,而起始数组访问相同的位置但移过一次索引。

      我们需要将这两个信号列向量的原因是我将信息附加到起始向量的方式。我不确定您的数据是以行还是列为单位,因此为了使其完全独立于方向,我将确保您的数据在列中。这是因为如果我尝试追加0,如果我对行向量进行追加,我必须使用空格来表示我要去下一列。如果我为列向量执行此操作,则必须使用分号转到下一行。为了完全避免检查是否是行向量或列向量,我将确保它是一个列向量,无论如何。

      查看代码m=2。这意味着当您开始写入此数组时,第一个位置是0。因此,我人为地在这个数组的开头放置了一个0,然后用其余的值跟着它。

      希望这有帮助!

答案 1 :(得分:1)

您可以尝试以下代码

time_diff = diff(bouts4);
new_feeding = time_diff > 75;
boutend4 = bouts4(new_feeding);
boutstart4 = [0; bouts4(find(new_feeding) + 1)];