我正在开发一个应用程序,这个应用程序允许用户背诵电话,然后,这个朗读的音频,并应用FFT,然后它与另一个音频交叉相关(预先存储) 。一切都很好,但我使用的互相关技术太长了!!!
所以我需要另一种交叉相关方法,这需要更少的时间。或者可能是互相关的替代方案。
我搜索了很多,从这个链接我发现互相关可以实现如下:
corr = ifft(fft(a and zeroes) * fft(b and zeroes[reversed]))
这是链接:
http://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two- audio-files-are-similar
但我真的不明白它,我不知道如何在java代码中实现它... 如果有人能帮助我,我会非常谨慎。
这是我目前使用的互相关代码:
public void Correlation (){
int d;
if(audioDataDoubles.length>audioDataDoubles3.length)
d=audioDataDoubles3.length;
else
d=audioDataDoubles.length;
int t,g,delay,maxdelay = (d+1);
double mean1,mean2,sx,sy,sxy = 0,denom,r;
int c=0;
ArrayList <Double> CorrelationArray=new ArrayList <Double>();
/* Calculate the mean of the two series x[], y[] */
mean1 = 0;
mean2 = 0;
for (t=0;t<(int)(d/2);t++) {
mean1 += magnitude[t];
mean2 += magnitude3[t];
}
mean1 /= (int)(d/2);
mean2 /= (int)(d/2);
/* Calculate the denominator */
sx = 0;
sy = 0;
for (t=0;t<(int)(d/2);t++) {
sx += (magnitude[t] - mean1) * (magnitude[t] - mean1);
sy += (magnitude3[t] - mean2) * (magnitude3[t] - mean2);
}
denom= Math.sqrt(sx*sy);
/* Calculate the correlation series */
for (delay=-maxdelay;delay<maxdelay;delay++) {
sxy = 0;
for (t=0;t<(int)(d/2);t++) {
g = t + delay;
if (g < 0 || g >= (int)(d/2))
continue;
else
sxy += (magnitude[t] - mean1) * (magnitude3[g] - mean2);
}
r = sxy / denom;
CorrelationArray.add(c,r);
c++;
/* r is the correlation coefficient at "delay" */
}
MaximumCoefficient= Collections.max(CorrelationArray);
String data2 = String.valueOf(MaximumCoefficient);
display.setText(data2);
}