Audio 智能手机上音符的音高识别

Audio 智能手机上音符的音高识别,audio,signal-processing,fft,pitch-tracking,Audio,Signal Processing,Fft,Pitch Tracking,在有限的资源(如较慢的CPU、代码大小和RAM)下,如何最好地检测音符的音调,类似于电子或软件调谐器的功能 我应该使用: 接吻 FFTW 离散小波变换 自相关 过零分析 倍频程间隔滤波器 其他的 简而言之,我想做的是识别一个音符,中间C以下两个八度到中间C以上两个八度,在任何(合理的)乐器上演奏。我希望在半音阶的20%以内——换句话说,如果用户演奏得太平缓或太尖锐,我需要区分这一点。但是,我不需要调整所需的精度。在我的项目中,我从中获取了代码。它基本上需要一个FFT,然后通过在FFT上放置一

在有限的资源(如较慢的CPU、代码大小和RAM)下,如何最好地检测音符的音调,类似于电子或软件调谐器的功能

我应该使用:

  • 接吻
  • FFTW
  • 离散小波变换
  • 自相关
  • 过零分析
  • 倍频程间隔滤波器
其他的


简而言之,我想做的是识别一个音符,中间C以下两个八度到中间C以上两个八度,在任何(合理的)乐器上演奏。我希望在半音阶的20%以内——换句话说,如果用户演奏得太平缓或太尖锐,我需要区分这一点。但是,我不需要调整所需的精度。

在我的项目中,我从中获取了代码。它基本上需要一个FFT,然后通过在FFT上放置一条三次曲线并找到该曲线的峰值来找到峰值功率。虽然我不得不防止八度跳,但效果相当不错


请参阅。

如果您想实时(精确到半音阶的1/100以内)进行音调识别,您唯一真正的希望是零交叉方法。很抱歉,这是一个微弱的希望。过零可以通过几个波长的数据来估计基音,也可以通过智能手机的处理能力来实现,但并不特别准确,因为测量波长的微小误差会导致估计频率的较大误差。像吉他合成器这样的设备(从只有两个波长的吉他弦推断音高)是通过将测量值量化为音阶的音符来工作的。这可能适用于您的目的,但请注意,过零在简单波形中效果很好,但在更复杂的乐器声音中效果越来越差

在我的应用程序(在智能手机上运行的软件合成器)中,我使用单乐器音符的录音作为波表合成的原材料,为了产生特定音高的音符,我需要知道录音的基本音高,精确到半音阶的1/1000以内(我真的只需要1/100的精度,但我对此有点强迫症)。过零法对此太不准确了,基于FFT的方法要么太不准确,要么太慢(有时两者兼而有之)

在这种情况下,我发现最好的方法是使用自相关。通过自相关,你基本上可以猜测音高,然后测量相应波长下样本的自相关。通过扫描看似合理的音高范围(比如A=55 Hz到A=880 Hz)通过半色调,我找到最相关的音调,然后在该音调附近进行更细粒度的扫描,以获得更准确的值


最适合你的方法完全取决于你想用它做什么。

过零不起作用,因为典型的声音有谐波和过零,远远超过基频

我(作为一个家庭项目)尝试的是:

  • 使用ADC以您需要的任何采样率对声音进行采样
  • 检测波形(滑动窗口或类似)的短期正负峰值水平,即包络检测器
  • 当波形在正包络的90%范围内(约90%)时,产生一个高的方波,当波形在负包络的90%范围内时,产生一个低的方波,即具有滞后的跟踪方波
  • 通过直接计算计数/时间来测量该方波的频率,根据需要使用尽可能多的样本以获得所需的精度

  • 然而,我发现,通过电子键盘的输入,对于某些乐器的声音,它能够拾取2倍的基频(下一个八度)。这是一个附带项目,在着手其他事情之前,我从未着手实施过解决方案。但我认为它有望比FFT少很多CPU负载。

    我不熟悉您提到的所有方法,但您选择的方法应主要取决于输入数据的性质。您是在分析纯音,还是在分析纯音您的输入源有多个音符?语音是您输入的一个特征吗?您对输入采样的时间长度是否有任何限制?您是否能够在一定的准确性和速度之间进行权衡

    在某种程度上,你选择什么还取决于你是想在中还是在中执行你的计算。将频率表示转换为频率表示需要时间,但根据我的经验,往往会得到更好的结果

    比较时域中的两个信号。简单的实现很简单,但计算成本相对较高,因为它需要对原始信号和时移信号中的所有点进行成对差分,然后进行差分以识别自相关函数中的转折点,然后选择最小对应点对于基频。有其他方法。例如,是一种非常便宜的自相关形式,但精度会受到影响。所有自相关技术都有倍频程误差的风险,因为函数中存在基频以外的峰值

    测量简单明了,但如果信号中存在多个波形,则会遇到问题

    在频率空间中,基于的技术可能对您的目的足够有效。一个例子是谐波积频谱技术,它将信号的功率谱与每个谐波的下采样版本进行比较,并通过将频谱相乘以产生清晰的峰值来识别基音

    和以往一样,没有什么可以替代测试和分析几种技术,以经验确定什么最适合您的问题和约束

    像这样的回答只能触及这个话题的表面。除了前面的链接,这里还有一些相关的参考