在使用傅立叶变换和一些数据清理对记录的拨号音进行频谱分析后,我最终得到了一个如下所示的二进制矩阵(红色为0,黄色为1)。每个像素代表矩阵中的一个点。
X轴是时间,Y轴是声音频率(与问题无关)。我想要做的是确定在任何给定时间点当前正在播放哪两个频率。我试图尽可能地清理数据,这就是为什么矩阵是二进制的,大多数簇是彼此分离的。
我需要做的是找出频率变化的每个点的簇,并垂直计算出它们的复合值,如图所示
对于这类问题应该有一个众所周知的解决方案,特别是像这样的二进制矩阵,但我不能想到一个可以证明有效的简单算法。我并不想真正想要解决这个问题。
简单地说,我需要以某种方式将所有这些黄色正方形聚类分组为单个点,或类似的东西。使用R的解决方案将是首选,但我也接受一般算法/方法。
答案 0 :(得分:1)
我不会将此阈值设置为二进制矩阵,因为这会抛弃信息。
解决这个问题的一种方法是作为动态程序。将频率划分为有限数量的区间,并将时间划分为有限数量的区间。每次,您需要以最小化惩罚函数的方式选择两个频率。我会使惩罚函数有两个组成部分:
1)一个组件测量给定时刻的频率选择有多好。取所选频率之外的所有强度的平均值,并取所选频率的两个强度的平均值。现在总结每个频率的强度与它所贡献的平均值之间差异的平方。
2)如果当前时刻的所选频率与前一时间步的所选频率不同,则另一个分量是惩罚。
现在运行一个动态程序来查找频率分配,从而最小化两个惩罚函数的总和。两个贡献的相对大小必须是可调参数。
这种方法并没有利用频率在常规时间变化的事实,所以也许有更好的方法,特别是如果你知道那些时间是什么。