自相关通过麦克风输入返回随机结果(使用高通滤波器)

很抱歉问我之前问过的问题 ( FFT问题(返回随机结果) ),但我查找了音高检测和自相关,并找到了一些使用自相关进行音高检测的代码。

我试图做一个用户唱歌的音高检测。 问题是,它不断返回随机结果。 我从http://code.google.com/p/yaalp/获得了一些代码,我已将其转换为C ++并进行了修改(如下)。 我的采样率是2048,数据大小是1024.我正在检测正弦波和麦克风输入的音高。 正弦波的频率为726.0,并且检测到它为722.950820(即可),但是它检测到麦克风的音高为从100到1050左右的随机数。

我现在使用高通滤波器来消除DC偏移,但它不起作用。 我做得对吗,如果是的话,我还能做些什么来解决它? 任何帮助将不胜感激!

(固定)

谢谢,

尼尔。

编辑:更改了代码以实现截止频率为30hz的高通滤波器(来自什么是高通滤波器和低通滤波器?) ,任何人都可以告诉我如何使用卷积转换为高通滤波器?)但它仍然返回随机结果。 不幸的是,将它插入VST主机并使用VST插件来比较频谱不是一个选项。

编辑:修复,感谢大家的帮助,但我从来没有让它工作,现在使用新的代码。

我不是专家,但如果您使用44100(我猜每秒采样)并使用1024个数据点进行采样。 您正在处理大约1/40秒的数据。 我并不让我感到惊讶的是,目前的音调变化很大,这取决于你选择哪一首。 如果你想找到一个声音的平均或主音高,我预计需要大约1秒的数据。

在44.1 kHz采样频率下,1024个采样仅略高于23 ms的数据。 难道这不仅仅是为了计算人类歌手的音调而言数据不足吗?

我的意思是,我可以持续23毫秒的声音可能不是我有很多音调控制的东西; 我希望这种测量可以在更长的时间内完成。

问题出在你的findBestCandidates()函数中:

在此函数中,您可以访问“输入”数组,从0到’长度 – 1’。 当你在detectPitchCalculation()函数中调用这个函数时,’inputs’是’results’而’length’是’nHiPeriodInSamples’。 但’结果’仅被分配并填充到’nHiPeriodInSamples – nLowPeriodInSamples – 1’。 因此,如果’nLowPeriodInSamples’大于0,则可以访问findBestCandidates()函数内的未分配和随机内存!

编辑:

另一个错误是你在detectPitchCalculation()函数中填充’results’数组的每个’nResolution’条目,但是访问findBestCandidates()函数中的每个条目(通过’inputs’参数)。 但是,因为你用’nResolution = 1’调用detectPitchCalculation(),这并不能解释你的具体问题…所以我会多看一点。 但如果你用更高的分辨率调用它肯定会有问题。

我没有在你的代码中看到问题,但是我对C不好。但我会尝试以下方法来找到问题:

  • 运行数据,其中结果是已知的,例如以sin(x)作为输入
  • 以小数据大小运行它(例如2)

将结果与已知正确结果进行比较。 您应该能够在互联网上找到这些,或手工完成。

如果随机意味着:相同的输入,不同的输出,你很可能在变量的初始化中有一些错误。 使用调试器和已知输入来检查所有变量,尤其是数组的所有元素是否已正确初始化。