我想要实现的是区分音频文件中的单独音符。为简单起见,我们可以说一个接一个地播放几个音符。主要问题是如何确定下一个音符何时播放?
我已经做过的是从音频文件中读取样本,并使用JTransforms库对这些样本进行傅里叶变换。这就是我得到的:
。
然后我根据FFT返回的数据计算了频谱,这是我得到的:
。
据我了解更大的"列"在图表上是谐波,小的是噪声和其他非谐波泛音,对吗?
之后我尝试用音频文件做同样的过程,一个接一个地播放两个音符,但结果有点相同。
作为一个附带问题,您是否知道一些轻量级和快速的库可视化此类数据?因为对于更大的数据集使用JFreeChart对我的处理器来说是一个真正的痛苦。
答案 0 :(得分:1)
为了检测不同频率的连续频率突发及其一些时域参数,可以使用重叠的短FFT窗口(长度短于预期的突发长度)并查找频率峰值的相对幅度交换顺序的位置,或者高于/低于阈值。如果您事先知道所涉及的频率,您可以使用Goertzel滤波器而不是FFT,使用滑动窗口或时间上的逐次逼近来获得更精细的时域粒度。
对于音调音符(例如音乐),人们可以做类似的事情,除了在足够短的时域数据窗口上使用音调检测/估计方法(而不是简单的FFT幅度,这是不可靠的)。