Matlab 录制';爆发';以每秒300个样本的速度采集样本

Matlab 录制';爆发';以每秒300个样本的速度采集样本,matlab,Matlab,我正在记录一个小电路上的电压变化——这记录了老鼠的进食。当鼠标吃东西时,电路电压发生变化,我将其转换为1和0,一切正常 但是-我想计算“突发”馈电的次数和持续时间-也就是说,在250毫秒(75个样本)内发生的电路闭合实例。如果关闭之间的间隔大于250ms,我想将其算作新的“突发” 我想我正在寻求帮助,请matlab将数字文件中每个1的样本数与下一个1的样本数进行比较-如果差异大于75,则将第一个1称为一轮比赛的结束,将第二个1称为另一轮比赛的开始,将差异归类为差距,但如果不是,保留前一个1的样本

我正在记录一个小电路上的电压变化——这记录了老鼠的进食。当鼠标吃东西时,电路电压发生变化,我将其转换为1和0,一切正常

但是-我想计算“突发”馈电的次数和持续时间-也就是说,在250毫秒(75个样本)内发生的电路闭合实例。如果关闭之间的间隔大于250ms,我想将其算作新的“突发”

我想我正在寻求帮助,请matlab将数字文件中每个1的样本数与下一个1的样本数进行比较-如果差异大于75,则将第一个1称为一轮比赛的结束,将第二个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
我真的不想对这两个变量进行迭代

有什么想法吗


-DB

这其实还不错。我们可以把它完全矢量化。首先,让我们从两个信号开始:

  • 一个未被触动的版本
  • 在时间上移动1步的电压版本(即,它在时间索引=2时开始)
  • 现在基本算法是:

  • 检查每个元素,看看差异是否超过阈值(在您的案例中为75)
  • 在单独的数组中枚举每个元素的位置
  • 现在进入代码

    %// 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
    的工作方式基本相同。但是,我决定不使用它,这样您就可以看到您编写的代码是如何以矢量化的方式进行翻译的。学习的唯一方法,对吗

    回去吧! 让我们慢慢来。前两行代码产生了我所说的信号。一个原始的(最长为
    长度(bouts)-1
    )和另一个长度相同但移动了一个时间索引的。接下来,我们使用
    find
    查找时间索引为
    =75
    的时隙。之后,我们使用这些位置访问
    bouts
    数组。结束数组访问原始数组,而开始数组访问相同的位置,但移动了一个时间索引

    我们需要将这两个信号列向量的原因是我将信息附加到起始向量的方式。我不确定您的数据是以行还是以列的形式出现,所以为了使其完全独立于方向,我将确保您的数据以列的形式出现。这是因为如果我尝试附加一个
    0
    ,如果我将它附加到一个行向量,我必须使用一个空格来表示我将进入下一列。如果我对列向量这样做,我必须使用分号转到下一行。为了完全避免检查它是行向量还是列向量,我将确保它是列向量

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


    希望这有帮助

    您可以尝试以下代码

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

    你好这很有帮助!还有一个问题-为什么有时我的持续时间为零??这肯定不应该发生吗?非常感谢much@user2312820:不客气。当你说“持续时间”为零时,你是说连续电压之间的差值有时可能为零吗?如果是这样的话,那么这是有意义的,因为在特定的样本采集过程中,施加的电压可能没有变化,因此连续读数之间的差值将不可避免地为零。你能澄清一下吗?我从boutend中减去boutstart,这一回合的长度似乎是0个样本——如果是这样,为什么要计算?我不是看电压本身,而是看采集电压的采样时间。如果一场比赛从255开始,怎么也能在255结束??我可以(并且已经)排除10毫秒以下的持续时间(3个样本),但仍然不太理解zeroes@user2312820:您可能需要在
    boutend
    数组的末尾添加一个额外的零,因为我们没有计算结尾的值。因此,只需通过执行以下操作向其添加一个0:
    [bouts4(loc);0]。至于零,这可能是因为我们忘记在末尾包含一个
    0
    。尝试这样做,看看您的数据是否对齐。