我正在尝试对用户唱歌进行实时音调检测,但我遇到了很多问题.我已经尝试了很多方法,包括FFT(FFT问题(返回随机结果))和自相关(自相关音调检测返回麦克风输入的随机结果),但我似乎无法获得任何方法来给出好的结果.任何人都可以建议一种实时音高跟踪方法或如何改进我已有的方法?我似乎无法找到任何好的C/C++方法进行实时音高检测.
谢谢,
尼尔.
编辑:请注意,我已经检查过麦克风输入数据是否正确,并且当使用正弦波时,结果或多或少是正确的音高.
编辑:对不起,这是迟到的,但此刻,我通过从结果数组和每个索引中取出值,并在X轴上绘制索引和在Y轴上绘制值来显示自动相关(两者都被除以100000或其他东西,我使用OpenGL),将数据插入VST主机并使用VST插件不是我的选择.目前,它看起来像一些随机点.我正确地做了,或者你能不能指点我做一些代码或者帮助我理解如何可视化原始音频数据和自相关数据.
我试图找出两个2D矢量之间的角度(以度为单位).我知道我需要使用trig,但我对它不太好.这就是我想要解决的问题(Y轴向下增加): 替代文字http://i38.tinypic.com/2dcefch.png
我正在尝试使用此代码,但它根本不起作用(由于某种原因计算随机角度):
private float calcAngle(float x, float y, float x1, float y1)
{
float _angle = (float)Math.toDegrees(Math.atan2(Math.abs(x1-x), Math.abs(y1-y)));
Log.d("Angle","Angle: "+_angle+" x: "+x+" y: "+y+" x1: "+x1+" y1: "+y1);
return _angle;
}Run Code Online (Sandbox Code Playgroud)
这些是我的结果(提供恒定位置时常数,但是当我改变位置时,角度改变,我找不到两个角度之间的任何连接):
位置1:x:100 y:100 x1:50 y1:50角度:45
位置2:x:92 y:85 x1:24 y1:16角度:44.58
位置3:x:44 y:16 x1:106 y1:132角度:28.12
编辑:谢谢所有回答并帮助我弄清楚错误的人!对不起,标题和问题令人困惑.
我正在尝试使用C++进行实时音高检测.我正在测试一些来自Performous(http://performous.org/)的代码,因为其他一切对我来说都不起作用.我确信这有效,但我不能让它发挥作用.我已经尝试了几个星期了,而且我还没有能够得到任何音调检测代码.
我试图找出一种算法,用于找到距离基点一定距离的随机点.例如:
替代文字http://i34.tinypic.com/2e4vxao.png
这可能只是基本的数学和我的大脑还没有工作(原谅我,还没有我的咖啡:)),但我一直试图在纸上解决这个问题而且我没有到达任何地方.
我有这个代码,但它会随机返回0到1050左右的随机频率.请你帮我理解为什么会这样.
我的数据长度为1024,采样率为8192,数据是一个填充了麦克风输入数据的短阵列.
float *iSignal = new float[2048];
float *oSignal = new float[2048];
int pitch = 0;
for(x=0;x<=1024;x++) {
iSignal[x] = data[x];
}
fft(iSignal,oSignal,1024); //Input data, output data, length of input and output data
for(int y=0;y< 2048;y+=2) {
if((pow(oSignal[y],2)+pow(oSignal[y+1],2))>(pow(oSignal[pitch],2)+pow(oSignal[(pitch)+1],2))) {
pitch = y;
}
}
double pitchF = pitch / (8192.0/1024);
printf("Pitch: %f\n",pitchF);
Run Code Online (Sandbox Code Playgroud)
谢谢,
尼尔.
编辑:更改了代码,但它仍然返回随机频率.