我对发病检测相当陌生。我阅读了一些关于它的论文,并且知道仅使用时域时,可能会有大量的误报/否定,并且通常建议同时使用时域和频域或频域。
关于这一点,我有点困惑,因为我在如何使用频谱能量或 FFT bin 的结果来确定音符开始方面遇到了麻烦。因为,音符的开始不是由振幅的尖峰代表吗?
有人可以启发我吗?谢谢!
我对发病检测相当陌生。我阅读了一些关于它的论文,并且知道仅使用时域时,可能会有大量的误报/否定,并且通常建议同时使用时域和频域或频域。
关于这一点,我有点困惑,因为我在如何使用频谱能量或 FFT bin 的结果来确定音符开始方面遇到了麻烦。因为,音符的开始不是由振幅的尖峰代表吗?
有人可以启发我吗?谢谢!
这是考虑音符开始的最简单方法:
将音乐信号视为平坦的恒定信号。当和开始发生时,您将其视为信号的快速变化(正峰值或负峰值)
这在频域中意味着什么:
恒定信号的 FT 是,嗯,CONSTANT!平
当发病事件发生时,光谱含量会迅速增加。
虽然您可能会想“嗯,您实际上是在谈论发病高峰,对吗?” 一点也不。我们实际上并不对起始峰值感兴趣,而是对信号的上升沿感兴趣。当信号急剧增加时,高频含量增加。
一种方法是使用光谱差异函数:
1)获取您的时域信号并将其切割成重叠的条带(通常为 50% 重叠)
2)应用一个汉明/汉恩窗口(这是为了减少光谱污迹)(记住将信号切割成窗口就像将它乘以一个脉冲,在频域中它就像用一个正弦函数对信号进行卷积)
3)在两个连续的窗口上应用 FFT 算法
4) 对于每个 DFT bin,计算 Xn 和 Xn-1 bin 之间的差异,如果它是负数,则将其设置为零平方结果并将所有 th bin 相加
5) 重复直到信号结束。
6)使用中值阈值寻找信号峰值,并且有你的发作时间!
来源:
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
和 http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
您可以将特定频率处振幅的急剧差异视为可疑的声音起始点。例如,如果长笛从演奏 G5 切换到演奏 C,频谱的幅度将在 784 Hz 左右急剧下降。
如果您不知道要检查的频率,FFT 矢量的幅度将为您提供某个时间窗口内每个频率的幅度(分辨率取决于时间窗口的长度)。选择您的频率或一堆频率,然后区分两个不同时间窗口的两个 FFT。这可能会给你一些东西,可以用作声音开始的可能性估计的一部分,或者在两个时间窗口之间的某个地方发生变化。滑动窗口或在时间上连续逼近它们的位置可能有助于缩小可疑音符开始或声音其他显着变化的时间。
“因为,音符的开始不是由振幅的尖峰代表吗?” 答:并非总是如此。在打击乐器(包括钢琴)上确实如此,但对于小提琴、长笛等,音符经常随着频率变化而“滑入”彼此,而幅度没有急剧增加。如果您坚持使用单一乐器,例如钢琴起始检测是可行的。广义发病检测是一个更加困难的问题。大约有十几个原始特征已用于发病检测。一旦对它们进行编码,您仍然必须决定如何最好地使用它们。