【问题标题】:recording 'bursts' of samples at 300 samples per sec以每秒 300 个样本记录“突发”样本
【发布时间】:2014-05-20 22:01:49
【问题描述】:

我正在记录一个小电路上的电压变化 - 这记录了鼠标的喂食。当老鼠吃东西时,电路电压发生变化,我将其转换为 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...

有什么想法吗??

-数据库

【问题讨论】:

    标签: matlab


    【解决方案1】:

    你可以试试下面的代码

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

    【讨论】:

      【解决方案2】:

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

      1. 未改动的电压版本
      2. 一个版本的电压,它在时间上移动了 1 步(即它从时间索引 = 2 开始)。

      现在基本算法真的是:

      1. 遍历每个元素,查看差异是否高于阈值(在您的情况下为 75)。
      2. 在单独的数组中枚举每个位置的位置

      现在进入代码!

      %// 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,并在其后面加上其余的值。

      希望这会有所帮助!

      【讨论】:

      • 嗨!这很有帮助!还有一个问题-为什么有时我的持续时间为零?这肯定不应该发生吗?非常感谢
      • @user2312820:不客气。当您说零的“持续时间”时,您的意思是连续电压之间的差异有时可能为零吗?如果是这种情况,那么这是有道理的,因为在某些样本收集期间,施加的电压可能没有改变,因此连续读数之间的差异将不可避免地为零。你能澄清一下吗?
      • 我从 boutend 中减去 boutstart 并且 bout 的长度似乎是 0 个样本 - 如果是这种情况,为什么要计算它?我看的不是电压本身,而是收集它们的采样时间。如果一个回合从 255 开始,它怎么会在 255 结束?我可以(并且已经)排除了长度小于 10 毫秒的持续时间(3 个样本),但仍然不太了解零
      • @user2312820:您可能需要在boutend 数组的末尾添加一个额外的零,因为我们没有计算末尾的值。因此,只需通过执行以下操作将 0 添加到它:[bouts4(loc); 0];。至于零,这可能是因为我们忘记在末尾包含0。尝试这样做,看看您的数据是否对齐。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多