我正在尝试为 Android 手机制作一个简单的音高检测应用程序。我已经让手机显示我计算的自相关值的图表,这些值存储在双精度的一维数组中。现在我需要弄清楚如何检测数组中的重复模式。这是自相关图的屏幕截图,我以稳定的音调哼唱:
我尝试实现此幻灯片中给出的一维数组的递归寻峰算法:http: //courses.csail.mit.edu/6.006/spring11/lectures/lec02.pdf但我在 Android 上出现内存不足错误。
接下来,我尝试实现类似这种算法来查找二阶导数:https ://stackoverflow.com/a/3869172但是来自手机的自相关值非常不稳定,以至于它发现了太多的最小值和最大值。
我需要弄清楚如何做是对自相关数据应用某种过滤器以使其平滑,但我数学很烂,不知道该怎么做。我尝试将自相关值四舍五入到小数点后几位,但没有得到我想要的结果。
基本上我需要帮助来弄清楚如何找到重复模式的整体最大值(实际上只有第一个可能没问题)。在上面的屏幕截图中,模式是一个高峰,然后是两个较短的峰。我需要知道第二个高峰何时发生,以便我可以计算音高。