【问题标题】:How do I identify clusters of the same values in a binary matrix?如何识别二进制矩阵中相同值的簇?
【发布时间】:2016-01-24 01:48:06
【问题描述】:

在使用傅里叶变换和一些数据清理对记录的拨号音进行频谱分析后,我最终得到了一个看起来像这样的二进制矩阵(红色为 0,黄色为 1)。每个像素代表矩阵中的一个点。

X 轴是时间,Y 轴是声音频率(与问题无关)。我要做的是确定在任何给定时间点当前正在播放的两个频率。我已经尝试尽可能多地清理数据,这就是为什么矩阵是二进制的,并且大多数 是相互分离的。

我需要做的是找出频率变化的每个点的簇,并垂直计算它们的复合值,如图所示

感觉这种问题应该有一个众所周知的解决方案,尤其是对于像这样的二进制矩阵,但我就是想不出一个可以证明有效的简单算法。我真的不想只关注解决方案。

简单地说,我需要以某种方式将所有这些黄色的方形簇组合成一个点,或者类似的东西。使用 R 的解决方案将是首选,但我也会接受通用算法/方法。

【问题讨论】:

  • 你应该添加你的代码/尝试以及为什么它们不工作
  • @rawr 没有代码,我在问如何解决这个问题,因为我不知道如何处理它。这是算法问题,不是编码问题。
  • 那么你在错误的堆栈交换站点上询问

标签: r algorithm matrix


【解决方案1】:

我不会将此阈值设为二进制矩阵,因为这会丢弃信息。

解决这个问题的一种方法是作为一个动态程序。将频率划分为有限数量的 bin,将时间划分为有限数量的 bin。对于每次,您需要以最小化惩罚函数的方式选择两个频率。我会让惩罚函数有两个组成部分:

1) 一个分量衡量给定时刻的频率选择有多好。取所选频率之外的所有强度的平均值,并取所选频率的两个强度的平均值。现在将每个频率的强度与其贡献的平均值之间的差的平方相加。

2) 如果当前时刻选择的频率与前一个时间步的选择频率不同,则另一个分量是惩罚。

现在运行一个动态程序来找到最小化两个惩罚函数的总和的频率分配。两个贡献的相对大小必须是一个可调参数。

这种方法没有利用频率定期变化的事实,所以也许有更好的方法,特别是如果你知道那些时间是什么。

【讨论】:

  • 由于色调之间的间隙似乎很短,我认为有一种简单的方法可以检测它们之间的时间界限:只需将每个像素列中的所有(同样,未阈值的)强度值相加。这些总和将在每个边界处短暂降至接近零,然后返回大致恒定的值。这本身可能就足够可靠了,但如果不是(即,如果错过了一些下降),那么 FFT 将毫无问题地提取基频。
猜你喜欢
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 2020-03-20
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多