Ожидаемый формат ввода алгоритма FFT - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь сделать 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)

Является ли конечность фактором?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...