我正在实施一个音高检测系统,我在其中检测单个音符(吉他)的音高。
我最近发现了这个库,它可以检测音频信号中的和弦。
当信号中有和弦时,这已被证明很好。准确性很高,而且速度也很快。但是,它也会在播放单音旋律时检测和弦。这就是为什么我想实现一种算法来区分有旋律演奏或和弦演奏的时刻。
和弦检测算法返回如下内容:
[( 0. , 1.2, u'N') ( 1.2, 3.4, u'E:maj') ( 3.4, 5.5, u'F:maj')
( 5.5, 7.6, u'F#:maj') ( 7.6, 9.7, u'G:maj')
( 9.7, 11.7, u'G#:maj') ( 11.7, 13.8, u'A:maj')
( 13.8, 16. , u'A#:maj') ( 16. , 18.1, u'B:min')
( 18.1, 20.4, u'C:maj') ( 20.4, 22.5, u'C#:maj')
( 22.5, 24.7, u'D:maj') ( 24.7, 26.6, u'D#:maj')
( 26.6, 28.4, u'E:maj') ( 28.4, 39.7, u'N') ( 39.7, 41.1, u'D#:maj')
( 41.1, 46.1, u'N') ( 46.1, 48. , u'A:maj') ( 48. , 52.3, u'E:maj')
( 52.3, 52.7, u'N')]
其中列表的每个元素代表开始时间、结束时间和和弦。“N”代表无和弦。
我尝试查看色谱图和频谱图中的均值和方差差异,但没有什么不同之处可以从中得出一个规则。
我还尝试在每一帧中取 3-4 个最强的峰值。如果这些峰值接近最低峰值的整数倍,则它们是谐波,因此可能只有一个音符。问题是在低音符(例如低 E 弦)中无论如何都会有很多不和谐,所以如果我为一个 E2 音符演奏三个峰值,其中一个可能不会是倍数。
有没有好的方法来做到这一点?我阅读的论文专注于标记和弦,但没有发现它们是否被演奏。