使用fft计算互相关(JTransforms)

时间:2017-11-07 08:02:57

标签: java signal-processing fft cross-correlation

我试图在听力记录中找到参考音频信号。为此,我使用两个信号之间的互相关(参考信号是线性啁啾,在.1s内从20kHz到21kHz,所以它应该具有相当不错的互相关特征)。出于效率原因,我想通过FFT(使用JTransforms库)来实现这一点。我的想法是这个(可能已经包含错误):

crossCorr(a, b) = ifft(fft(a_and_zeros) .* fft(b_and_zeros[reversed]))

这是我用来反转我的' b'信号并用零填充它(需要2 * SAMPLE_SIZE,因为referenceTone也将作为我的fft的缓冲区,它是JTransforms如何处理它的。)

//load reference signal
referenceTone = new double[SAMPLE_SIZE * 2];
int i = 0;
while((audioInputStream.read(b)) != -1){
    //getShortFrom bytes basically does 'return (short) ((b[0] << 8) | b[1])'
    short value = getShortFromBytes(b[0], b[1]);
    refT[i] = (double) value;
    referenceTone[SAMPLE_SIZE - ++i] = (double) value;
    //get fourier transform of reference signal
    DoubleFFT_1D fft_1D = new DoubleFFT_1D(SAMPLE_SIZE);
    fft_1D.realForwardFull(referenceTone);

现在,referenceTone应包含填充和反转参考信号的fft。下一步将是我录制的fft。我要在这里省略一些东西,因为我实时从麦克风录制,但sig包含我将参考信号与之比较的信号。

//fft of received signal
DoubleFFT_1D fft_1D = new DoubleFFT_1D(sig.length);
fft_1D.realForwardFull(fftSig);

//convolve signal
double[] crossCorr = new double[2 * SAMPLE_SIZE];
for(int i = 0; i < fftSig.length; i += 2){
    Complex refC = new Complex(referenceTone[i], referenceTone[i + 1]);
    Complex sigC = new Complex(fftSig[i], fftSig[i + 1]);
    Complex res = refC.multiply(sigC);
    //this is simply how JTransforms stores complex numbers
    crossCorr[i] = res.getReal();
    crossCorr[i + 1] = res.getImaginary();
}

//inverse fft of convoluted signal
fft_1D.complexInverse(crossCorr, true);

现在我害怕某个地方我犯了一个错误,因为我的结果并没有多大意义,因为我无法检测到我的参考信号。我真的很高兴任何可能出现错误的提议,因为我已经试图找到错误很长一段时间了。

0 个答案:

没有答案