2

I'm trying to find a reference audiosignal inside an audiorecording. To do this I use crosscorrelation between the two signals (the reference signal is a linear chirp that goes from 20kHz to 21kHz in .1s so it should have pretty decent crosscorrelation features). For efficiency reasons I want to do this via FFT (using the JTransforms library). My idea is this (which could already contain a mistake):

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

Here is the java code I use to invert my 'b' signal and pad it with zeros (the 2*SAMPLE_SIZE is needed since referenceTone will also serve as buffer for my fft, it's how JTransforms deals with this).

//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);

Now referenceTone should contain the fft of my padded and reversed reference signal. The next step will be, taking the fft of my recording. I'm going to omit some stuff here since I'm getting my recording from a microphone at real-time, but sig is containing the signal I'm comparing my reference signal to.

//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);

Now I'm affraid somewhere I'm making a mistake since my results don't really make much sense since I'm not able to detect my reference signal. I'm really glad for any proposition where a mistake could be since I've been trying to find the error for quite a while.

TropicalSpore
  • 119
  • 2
  • 9

0 Answers0