Создание файлов WAV из ArrayList фреймов, Java - PullRequest
0 голосов
/ 28 мая 2019

Я создал код, который читает WAV-файл и вычисляет среднюю энергию (RMS) для каждого кадра.

Код затем сохраняет все события, состоящие из последовательных значений кадра выше порога энергии, в ArrayList of Doubles:

   ArrayList<Double> significantEvent = new ArrayList<Double>();

Каждый раз, когда массив arrayList имеет 1 или более последовательных кадров, считанных в него (составляющих одно событие), событие добавляется в ArrayList из ArrayLists, приведенных ниже, перед очисткой для следующего набора кадров, который будетчитать.

  ArrayList<ArrayList<Double>> significantEventCollect = new ArrayList<ArrayList<Double>>();

В конце концов ArrayList Arraylists (событий) завершен.

В качестве примера, wav-файл, который я сейчас тестирую, содержит 5 событий, состоящих из разного количества кадров:

1   0.014028881507583106

2   0.028595488574905577
    0.04831942513880609
    0.018766566401686773

3   0.030843206764955628
    0.05321395077844886
    0.023906227291973788

4   0.027806758400863583
    0.04300524255389825
    0.020790246307126208

5   0.028774597939793384
    0.04015144549339461
    0.022221963876695557

Теперь я хотел бы воспроизвести эти события, которые, как я считаю, нужнысделать это путем создания новых файлов wav для каждого из них.

Однако я не уверен, что у меня достаточно информации для этого, и я не могу найти код, который может сделать это с ArrayList с небольшим количеством кадров.

Я нашел код из следующего источника: http://www.labbookpages.co.uk/audio/javaWavFiles.html

И попытался использовать код с этого сайта для записи wav-файлов, но я не уверен, как я могу использовать его с имеющимися у меня данными:

         int sampleRate = 44100;    // Samples per second
         double duration = event.size()/sampleRate ;     // Seconds

         // Calculate the number of frames required for specified duration
         long numFrames = (long)(duration * sampleRate);

         // Create a wav file with the name specified as the first argument
         WavFile wavFile = WavFile.newWavFile(new File(fileName + ".wav"), 2, numFrames, 16, sampleRate);

         // Create a buffer of 100 frames
         double[][] buffer = new double[1][(int) numFrames];

         // Initialise a local frame counter
         long frameCounter = 0;

         // Loop until all frames written
         while (frameCounter < numFrames)
         {
            // Determine how many frames to write, up to a maximum of the buffer size
            long remaining = wavFile.getFramesRemaining();
            int toWrite = (int) ((remaining > numFrames) ? numFrames : (int) remaining);

            // Fill the buffer, one tone per channel
            for (int s=0 ; s<toWrite ; s++, frameCounter++)
            {
               buffer[0][s] = Math.sin(2.0 * Math.PI * 400 * frameCounter / sampleRate);
               buffer[1][s] = Math.sin(2.0 * Math.PI * 500 * frameCounter / sampleRate);
            }

            // Write the buffer
            wavFile.writeFrames(buffer, toWrite);
         }

У меня проблемы с заполнением буфера в этом коде моими собственными данными.

Любые рекомендации для моих следующих шагов по созданию файлов wav из кусков кадровых вейлов, был бы очень признателен.

...