Я пытаюсь сделать Audio Fingerprinting, и первый шаг - прочитать аудио и передать его алгоритму FFT.
Я использую пакет javax.audio.sampled для чтения и преобразования данных.и то, что я прочитал, является подписанной волной PCM, со значениями, начинающимися с -128 в начале файла, за которыми следуют -127, -126, -125, когда волна идет вниз, или 127,126,125, ..., когда волнаидет вверх.
Это правильно?
Это код для чтения данных и подачи их в БПФ:
public static AudioInputStream getAudioDataBytes(String filename) throws IOException, UnsupportedAudioFileException {
File file = new File(filename);
AudioInputStream in= AudioSystem.getAudioInputStream(file);
AudioFormat baseFormat = in.getFormat();
AudioFormat convertFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(), 16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
AudioInputStream din = AudioSystem.getAudioInputStream(convertFormat, in);
//AudioFormat reconvertFormat = new AudioFormat(AudioFormat.Encoding.PCM_UNSIGNED, 11025, 8, 1, 2, 11025, false);
AudioFormat reconvertFormat = new AudioFormat(44100, 8, 1, true, false);
AudioInputStream din2 = AudioSystem.getAudioInputStream(reconvertFormat, din);
System.out.println("Conversion supported:" + AudioSystem.isConversionSupported(convertFormat, reconvertFormat));
AudioSystem.write(din2, Type.WAVE, new File(filename + ".wav"));
din2.close();
din.close();
in.close();
return AudioSystem.getAudioInputStream(new File(filename + ".wav"));
}
Затем:
AudioInputStream ais = MP3Converter.getAudioDataBytes(inputFile);
int available = ais.available();
byte[] resultsdata = new byte[available];
System.out.println("Read whole file=" + (ais.read(resultsdata) == available));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
IOUtils.write(resultsdata, outputStream);
Complex[][] results = new DataProcessor().makeFFT(outputStream);
В какой-то момент после:
public Complex[][] makeFFT(ByteArrayOutputStream out) {
byte audio[] = out.toByteArray();
final int totalSize = audio.length;
int amountPossible = totalSize/CHUNK_SIZE;
//When turning into frequency domain we'll need complex numbers:
Complex[][] results = new Complex[amountPossible][];
//For all the chunks:
for(int times = 0;times < amountPossible; times++) {
Complex[] complex = new Complex[CHUNK_SIZE];
for(int i = 0;i < CHUNK_SIZE;i++) {
//Put the time domain data into a complex number with imaginary part as 0:
complex[i] = new Complex(audio[(times*CHUNK_SIZE)+i], 0);
}
//Perform FFT analysis on the chunk:
results[times] = FFT.fft(complex);
System.out.println(Arrays.toString(complex));
}
return results;
}
Может ли алгоритм FFT получать эти подписанные данные или ему нужны неподписанные данные?(Алгоритм БПФ находится по адресу: https://introcs.cs.princeton.edu/java/97data/FFT.java.html)
Является ли конечность фактором?