如何在多标签预测中进行中值滤波

信息处理 过滤器
2022-01-25 01:05:00

我正在尝试为钢琴执行自动音高跟踪。当只有一个音符被按下时,很容易检测到音符。钢琴上有88 个键,我将结果设置为其中一个。由于八度偏移,可能会出现分类错误。例如,我找到了 52 而不是 40。它们都是 C,但 52 高一个八度。我可以通过对结果执行中值滤波来消除大部分八度音阶偏移。

但是当我转向复音音高跟踪时,它会令人困惑。当有多个音符被压在一起时,在时间 t 检测到的音高数量可能不同。

例如,labels(f,t)如果在时间 t 检测到音符 f,则为 1,并使其二进制矩阵labels如下

labels = 0 0 0 0 1 ...
         1 1 0 1 0 ...
         0 1 0 0 1 ...
         .............
         0 0 1 0 1 ...
         .............
         0 0 0 0 1 ...

让检测到的音符对应如下:

labelsAsNotes = 2; 2 3; 14; 2; 1 3 14 88; ...

在这种情况下如何进行中值过滤?你有其他的建议来消除八度变化吗?

1个回答

我不认为中值滤波是解决这个问题的好方法。它绝对被用作单音高跟踪中的平滑机制,但我认为这不一定是最好的方法。例如,在跟踪单个音高时,动态规划算法可能非常强大。在每一帧音频中,您都有对他们具有一定实力的音调候选者。动态编程可以让你在这些候选者之间找到一条最佳路径,这样你就可以惩罚音高的大跳跃(比如整个八度音阶),同时提升具有高权重的音高候选者。

不过,据我所知,这并不能很好地扩展到多个音高。我见过作者使用这个算法在两个同时说话的情况下只跟踪两个音高。

一般来说,这是一个很难解决的问题,我认为仅仅过滤二进制矩阵就足够了——我认为你想要某种与每个音高候选相关的权重,并用这些权重做出决定。您还可以考虑时间 - 如果您检测到两个相隔一个八度(或其他整数倍)的音符,并且遵循相同的相对音高轨迹并在完全相同的时间开始,它们可能是同一个音符。您还可以尝试使用权重来抑制八度音阶错误——例如,如果您检测到一个音符,但在其频率的一半处有很大的能量,您可能正在查看八度音阶错误。