2015-08-11 3 views
1

Я пытаюсь создать систему распознавания музыки. Боюсь, я, возможно, не буду читать образцы wav, как и предполагалось, а также, что я могу использовать неправильные размеры окна, чтобы сделать БПФ и другие.Wav Reader и процессор в Java и основные вопросы wav для распознавания звука

Было бы здорово, если вы поможете мне.

Во-первых, у меня есть некоторые вопросы относительно обработки звука в Wavs.

1) У Wav есть заголовок вправо? Так будет ли следующий код правильно читать wav-файл?

private static byte[] getAudioBytes(String path_to_audio) throws IOException, UnsupportedAudioFileException{ 

    File audio_file = new File(path_to_audio); 
    // 
    AudioInputStream audio_input_stream = AudioSystem 
      .getAudioInputStream(audio_file); 
    byte audio[] = new byte[(int) audio_file.length()]; 
    audio_input_stream.read(audio); 

    return audio; 

} 

1.1) Если есть заголовок, как я могу его прочитать и каковы его поля? (Я смущен о разных заголовках, которые я видел в Интернете)

2) Еще один вопрос, я полагаю, запись wav-файла имеет размер кадра по умолчанию. Я прав?

2.1) Я должен отправить каждый кадр в БПФ. Если я использую другой размер кадра для отправки образцов в БПФ, это приведет к неправильным результатам, исправьте?

2.2) Если разные размеры кадра получают неверные результаты, как я могу использовать более крупные кадры, чтобы получить лучшую точность частоты? (например, скажем, исходный файл имеет 1024 кадра выборки, и я хочу использовать размер выборки 4096)

3) Было бы полезно использовать как на моем образце wav-файл, так и в моем исходном файле тот же бит глубина, правильно?

4) если это 16-битовая глубина, я должен использовать short в java справа?

В моем коде я читал кадры с образцами 4096 в нем, не касаясь размера кадра записи. Я видел несколько примеров распознавания песни, но они не объясняют большую часть этих деталей, и просто сказали, что они использовали 4096 как размер кадра, например. Я попытался найти такую ​​информацию и получить небольшую информацию, поэтому я прошу помочь здесь.

Спасибо заранее

ответ

1

Wav имеет заголовок. Правильно?

Да. Хорошую ссылку на структуру wav-файла на исходном уровне бит можно найти в the WAVE format specifications.

Как будет выглядеть код wav в следующем порядке?

Это будет правильно читать WAV заголовок поддерживаемых файлов WAV (быть готовым к обработке UnsupportedAudioFileException для менее распространенных расширений), и извлекать аудиоданные в сыром закодированном виде (то есть вам все равно придется декодировать необработанные данные себя получить осмысленные образцы). Обратите внимание, однако, что этот код выделяет больше необходимого размера буфера, поскольку audio_file.length() включает в себя размер заголовка, тогда как считывание буфера данных не выполняется (то есть буфер данных заполняется только закодированными образцами).

Если есть заголовок, как я могу его прочитать и каковы его поля?(Я смущен о различных заголовках, которые я видел в Интернете)

Поле заголовка указывается в the WAVE format specifications уже прочитано AudioInputStream, который затем присваивает соответствующие поля (например, encodingchannels и т.д.) из AudioFormat. Обратите внимание, что это не точное сопоставление «один-к-одному», поскольку AudioFormat является общим представлением, которое используется совместно с другими типами аудиофайлов, но очень часто все, что вам действительно нужно заботиться. К этому AudioFormat может быть подключен audio_input_stream.getFormat(). Если вы хотите конкретно посмотреть на структуру битов заголовка файла (или просто захотеть пытать себя), вы также можете напрямую использовать FileInputStream.

Запись wav-файла имеет размер кадра по умолчанию. Я прав?

Не совсем. «Кадр», используемый AudioInputStream в случае файлов wav, соответствует единовременному моменту, который включает в себя столько же образцов, сколько количество каналов (например, кадр будет единственным образцом для монофайла и 2 сэмплами для стереофайла). Размер такого фрейма всегда подразумевается из разных полей (например, количества каналов, количества байтов на выборку и т. Д.) В заголовке wav и применяется ко всему потоку. Кроме того, данные упаковываются в виде непрерывного блока с чередованием каналов, поэтому нет дополнительных разделов на более крупные блоки выборок.

Я должен отправить каждый кадр в БПФ. Если я использую другой размер кадра для отправки образцов в БПФ, это приведет к неправильным результатам, исправьте?

Если вы отправляете все каналы многоканального (например, стерео) wav-файла на один БПФ, то вы, скорее всего, получите результаты, которые не соответствуют вашим ожиданиям. Однако, как только вы отделите каналы, вы можете свободно выполнять БПФ любой длины по своему выбору (и по-прежнему получать разумные результаты).

Если разные размеры рамы не дают неправильных результатов, как я могу использовать более крупные кадры, чтобы получить лучшую точность частоты? (Например, позволяет сказать, что исходный файл имеет 1024 выборочные кадры, и я хочу использовать стандартный размер 4096 образец кадра)

Поскольку на самом деле только один блок данных для каждого канала, как только вы деперемежатьс каналы, только если вы не можете напрямую использовать размер FFT того же размера, что и доступный размер данных, если ваш исходный файл имеет меньше выборок, чем длина FFT, которую вы хотите использовать. Тем не менее, вы все равно можете выполнять БПФ большего размера путем нулевого заполнения образцов файлов.

Было бы полезно использовать как на моем образце wav-файл, так и в моем исходном файле такую ​​же глубину бит, не так ли?

Это зависит от ваших конкретных требований к применению. Глубина входного файла часто предоставляется вам с небольшим количеством действий. Обычно вы контролируете глубину бит выходного файла. Просто имейте в виду, что усечение ваших образцов для использования меньшей битовой глубины - операция с потерями. Поэтому часто бывает хорошей идеей хранить как можно больше бит на протяжении всей обработки, обрезая ее в самом конце. Так, например, вы можете выбрать один и тот же результат с большей битовой глубиной, чем ваш вход, если этот результат является промежуточным результатом в более длинной цепочке обработки.

Если это 16-битная глубина, я должен использовать short в java. Правильно?

Исправить.

+0

спасибо! Вы оказали огромную помощь! – anatp2015