При преобразовании частоты дискретизации на лету при чтении файла WAV в образцы выстраивают с Java

У меня есть набор коротких файлов WAV, которые я хотел бы обработать в Java с помощью различных алгоритмов обработки цифровых сигналов. Я должен добраться, массив интервала оценил образцы с этой целью, закодированный в частоте кадров на 11 025 Гц.

Исходные файлы имеют несколько различных частот дискретизации, включая 11 025 Гц и 44 100 Гц. Вот код, который я пытаюсь использовать для чтения их:

// read the WAV file
FileInputStream fileInputStream = new FileInputStream(new File("test.wav"));
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileInputStream );

// copy the AudioInputStream to a byte array called buffer
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] data = new byte[4096];
int tempBytesRead = 0;
int byteCounter = 0;
while ((tempBytesRead = audioInputStream.read(data, 0, data.length)) != -1) {
  bos.write(data, 0, tempBytesRead);
            byteCounter += tempBytesRead;
}
bos.close();
byte[] buffer = bos.toByteArray();

AudioFileFormat audioFileFormat = new AudioFileFormat(AudioFileFormat.Type.WAVE, audioInputStream.getFormat(), (int)audioInputStream.getFrameLength());

// get the resulting sample array
int[] samples = new int[audioFileFormat.getFrameLength()];
for (int i = 0; i < samples.length; i++) {
  samples[i] = getSampleValue(i); // the getSampleValue method reads the sample values from the "buffer" array, handling different encoding types like PCM unsigned/signed, mono/stereo, 8 bit/16 bit
}

// RESULT: the "samples" array

Проблема, что код не обрабатывает различные частоты дискретизации правильно. Таким образом для частоты кадров на 44 100 Гц я получаю в четыре раза больше образцов что касается частоты кадров на 11 025 Гц. Я хотел бы, чтобы получающийся демонстрационный массив использовал частоту кадров на 11 025 Гц, независимо от частоты кадров исходного файла. Я пытался вынудить Java преобразовать частоту кадров для меня при чтении AudioInputStream, но я получаю исключение, подобное следующему:

java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 11025.0 Hz, 16 bit, mono, 2 bytes/frame, 44100.0 frames/second, little-endian from PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian
    at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:955)

Я прочитал руководство по интерфейсу API Звука Java: http://java.sun.com/docs/books/tutorial/sound/converters.html. Кажется, что Звук Java API не поддерживает этот вид преобразования моей операционной системы (Windows 7). И я хотел бы избежать зависимостей от любых внешних библиотек. Там какой-либо путь состоит в том, чтобы сделать преобразование частоты дискретизации самостоятельно?

8
задан skaffman 16 February 2010 в 22:51
поделиться

1 ответ

Для частот дискретизации> 11025 Гц необходимо понизить дискретизацию, что является двухэтапным процессом. Сначала вам нужно использовать фильтр нижних частот, чтобы удовлетворить критерию Найквиста, а затем вы можете прореживать, например для данных с частотой дискретизации 44,1 кГц вам потребуется фильтр нижних частот с частотой среза 5,5 кГц, а затем вы можете отбросить 3 из каждых 4 отсчетов для коэффициента понижающей дискретизации 4: 1. Вам понадобится другой фильтр для каждого коэффициента понижающей дискретизации, который вы хотите поддерживать.

7
ответ дан 5 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: