很抱歉问了一个与我之前问过的问题类似的问题(FFT Problem (Returns random results)),但我查阅了音调检测和自相关,并找到了一些使用自相关进行音调检测的代码。
我正在尝试对用户唱歌进行音高检测。问题是,它不断返回随机结果。我从 http://code.google.com/p/yaalp/ 得到了一些代码我已将其转换为 C++ 并进行了修改(如下)。我的采样率为 2048,数据大小为 1024。我正在检测正弦波和麦克风输入的音调。正弦波的频率是 726.0,它检测到的频率是 722.950820(我可以接受),但它检测到麦克风的音调是一个从 100 到 1050 左右的随机数。
我现在使用高通滤波器来消除直流偏移,但它不起作用。我做得对吗?如果是,我还能做些什么来解决它?任何帮助将不胜感激!
(已修复)
谢谢
尼尔。
编辑:更改了代码以实现截止频率为 30hz 的高通滤波器(来自 What Are High-Pass and Low-Pass Filters? ,任何人都可以告诉我如何使用卷积将低通滤波器转换为高通滤波器吗?)但它仍然是返回随机结果。不幸的是,将其插入 VST 主机并使用 VST 插件来比较频谱对我来说不是一个选择。
编辑:已修复,感谢大家的帮助,但我从未让它工作,现在使用新代码。
最佳答案
我不是声音专家,但如果您使用 44100 个采样(我猜是每秒采样数)并使用 1024 个数据点。您正在处理大约 1/40 秒的数据。我并不感到惊讶的是,当前的音调变化很大,具体取决于您选择的轨道。如果您想找到声音的平均音调或主要音调,我预计需要大约 1 秒的数据。
关于c++ - 自相关返回麦克风输入的随机结果(使用高通滤波器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1353368/