gpt4 book ai didi

audio - 智能手机上音符的音高识别

转载 作者:行者123 更新时间:2023-12-03 11:48:45 25 4
gpt4 key购买 nike

在有限的资源(例如较慢的 CPU、代码大小和 RAM)的情况下,如何最好地检测音符的音高,类似于电子或软件调音器会做的事情?

我应该使用:

  • 吻FFT
  • FFTW
  • 离散小波变换
  • 自相关
  • 过零分析
  • 倍频程滤波器

  • 其他?

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

    最佳答案

    如果您不需要那么高的精度,FFT 就足够了。 Window首先是音频块,以便您获得明确定义的峰值,然后找到第一个重要峰值。

    bin 宽度 = 采样率/FFT 大小:

    基础知识 range from 20 Hz 至 7 kHz,因此 14 kHz 的采样率就足够了。下一个“标准”采样率为 22050 Hz。

    然后,FFT 大小由您想要的精度决定。 FFT 输出在频率上是线性的,而乐音在频率上是对数的,因此最坏情况下的精度将在低频处。对于 20 Hz 时 20% 的半音,您需要的宽度为 1.2 Hz ,这意味着 FFT 长度为 18545 .下一个 2 的幂是 215 = 32768。这是 1.5 秒的数据,我的笔记本电脑的处理器需要 3 毫秒来计算。

    这不适用于具有“missing fundamental ”的信号,并且找到“第一个显着”峰值有点困难(因为 harmonics are often higher than the fundamental ),但您可以找出适合您情况的方法。

    Autocorrelation and harmonic product spectrum更好地找到波的真正基波而不是谐波之一,但我认为它们不能很好地处理 inharmonicity ,而大多数乐器,如钢琴或吉他,都是不和谐的(和声比应有的稍微尖锐)。不过,这实际上取决于您的情况。

    此外,您可以使用 Chirp-Z transform 仅在感兴趣的特定频带内进行计算,从而节省更多处理器周期。 .

    我已经写了 a few different methods in Python用于比较目的。

    关于audio - 智能手机上音符的音高识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457228/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com