我试图在听力记录中找到参考音频信号。为此,我使用两个信号之间的互相关(参考信号是线性啁啾,在.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);
现在我害怕某个地方我犯了一个错误,因为我的结果并没有多大意义,因为我无法检测到我的参考信号。我真的很高兴任何可能出现错误的提议,因为我已经试图找到错误很长一段时间了。