区分注释FFT算法

Posted

技术标签:

【中文标题】区分注释FFT算法【英文标题】:Distinguish notes FFT algorithm 【发布时间】:2016-05-07 15:17:00 【问题描述】:

我想要实现的是区分音频文件中的单独音符。为简单起见,假设一个接一个地播放几个音符。主要问题是如何确定播放下一个音符的时间? 我已经做的是从音频文件中读取样本并使用 JTransforms 库对这些样本进行傅里叶变换。这是我得到的:. 然后我根据 FFT 返回的数据计算了频谱,这就是我得到的结果:. 据我了解,图表上较大的“列”是谐波,较小的是噪声和其他非谐波泛音,对吧?

之后,我尝试对音频文件进行相同的处理,两个音符一个接一个地播放,但结果是一样的。

作为一个附带问题,你们中是否有人知道一些用于可视化此类数据的轻量级和快速库?因为使用 JFreeChart 处理更大的数据集对我的处理器来说真的很痛苦。

【问题讨论】:

如果要识别音符,则需要执行pitch detection。请注意,音高与频率不同。它甚至与基波分量 (f0) 的频率不同。阅读谐波乘积谱,这是一种流行的音高检测方法。 我相信这与信号处理有关。我认为您需要应用滤波器(如带通滤波器以检查信号中是否存在频率)。基本上使用带通滤波器来检查 A、B、C、D 等...使用 FFT 无法知道特定音符是否在另一个音符之前播放(至少据我所知),因为它是基于频率的。也许您可以尝试检查信号(应用 FFT),直到您使用(带通滤波器)找到一个音符,然后再使用相同的方法进行另一个时间采样。不知道这是否会计算成本高昂。 @PaulR 我在 *** 上看到了很多关于信号处理的帖子,如果你决定分享你在这个领域的研究,你是否碰巧有一个博客?我可以通过 *** 以外的方式与您取得联系吗?我目前正在做一个巨大的项目,其中有许多子项目,涉及音高识别、语音识别和神经网络,在互联网上阅读一些信息并没有真正的帮助。 这是我关于音高估计主题的一些博客文章:musingpaw.com/2012/04/… 和频率估计:nicholson.com/rhn/dsp.html#1 在这些方面存在许多问题使用 FFT 进行音高检测。寻找他们 - 他们的答案可能是一个很好的起点 【参考方案1】:

要检测不同频率的连续频率突发,以及它们的一些时域参数,可以使用重叠的短 FFT 窗口(长度比预期的突发长度短)并寻找频率峰值的相对幅度交换顺序的位置,或者高于/低于阈值。如果您先验地知道所涉及的频率,则可以使用 Goertzel 滤波器而不是 FFT,使用滑动窗口或时间上的逐次逼近以获得更精细的时域粒度。

对于有音高的音符(如音乐),可以做类似的事情,除了在足够短的时域数据窗口上使用音高检测/估计方法(而不是简单的 FFT 幅度,这是不可靠的)。

【讨论】:

你说的 expected burst length 是什么意思?带有样本或时间(例如秒)的数组的长度?顺便说一句,Goertzel 滤波器对我的情况不太好,因为我试图找到频率当这些频率出现时。 窗口的长度影响时间频率分辨率的权衡。因此,更短/更小的时间分辨率(以秒或样本为单位,根据更短的音调需要)需要更短的窗口。加窗 Goertzel 滤波器与加窗 FFT 相同(1 个 bin,对于相同的窗长度)。

以上是关于区分注释FFT算法的主要内容,如果未能解决你的问题,请参考以下文章

怎样用C语言实现FFT算法啊?

FFT算法理解

FFT 算法错误

什么是FFT算法?DSP是什么?

用hadoop实现fft算法

怎么利用FFT算法对音频噪声进行处理