-2

该项目的前提是:

例如,会有预先录制的吉他音轨。学生将在他的吉他上演奏相同的曲目。我需要比较这两种声音,看看学生弹得好不好。我将首先使用 STM32 微控制器和 Keil uVision 软件进行仿真(用 C 语言编程)。

我知道我将使用使用 DMA 的 ADC,我假设我会快速傅里叶变换波信号,然后以某种方式比较两个频率响应。另外,节奏会不会有问题?我的意思是,每个音符都会精确到毫秒然后进行比较是不合逻辑的

我见过一些方法,如隐马尔可夫模型或 Goertzel 算法,但我不太确定它们做了什么,以及它们是否对项目来说是最优的和容易的。所以我的问题是:是否有最适合的特定算法以及我将如何在我的代码中实现它(因为我还没有真正开始研究代码,到目前为止主要是理论阅读)。

编辑:我昨天发表了类似的帖子,但我的前提太复杂而无法解决,所以我在一个新的前提下发布,更容易完成。我想不要在第一个线程上问,因为它会混淆两个不同的问题。

4

1 回答 1

0

假设您可以使用 FFT 来找出哪些音符在什么时间播放(这对于失真的吉他和弦来说可能会很困难),您可以对两个数据流执行此操作,例如每秒 10 次,然后检查音符在两个流匹配。这会给你一个百分比,如果你需要一个二进制值,你必须使用一个阈值。

如果两个流的长度不相等(不同的速度),那么您将不得不拉伸。您不必拉伸实际音频,只需拉伸音符测量之间的时间(例如,第一个流每 100 毫秒,第二个流每 125 秒一次)。

所以最大的问题可能是找出在任何给定时刻正在播放的音符。我将从构建频率到音符的映射开始。此外,在 1100 Hz 左右对信号进行低通滤波以消除一些不需要的谐波(无论如何你不能在吉他上弹奏更高的谐波)并类似地对信号进行高通滤波可能是一个好主意在 80 赫兹。然后在 FFT 或 DFT 之后(不确定您选择哪个重要),找到接近真实音符频率的频率。然后挑选最响亮的那个和那些相对于最响亮的那个高于某个阈值的那些(例如,丢弃任何小于最响亮的一半的声音,但是需要一些实验来找到一个好的阈值)。

于 2013-09-20T14:30:15.613 回答