Java-алгоритм нормализации звукаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Java-алгоритм нормализации звука

Сообщение Anonymous »

Я пытаюсь нормализовать аудиофайл речи.

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

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

Я провел небольшое исследование, и на сайте Xuggle представлен образец, демонстрирующий уменьшение громкости с помощью следующего кода: (полная версия здесь)

Код: Выделить всё

@Override
public void onAudioSamples(IAudioSamplesEvent event)
{
// get the raw audio byes and adjust it's value

ShortBuffer buffer = event.getAudioSamples().getByteBuffer().asShortBuffer();
for (int i = 0; i < buffer.limit(); ++i)
buffer.put(i, (short)(buffer.get(i) * mVolume));

super.onAudioSamples(event);
}
Здесь они изменяют байты в getAudioSamples() с помощью константы mVolume.

Основываясь на этом подходе, я попытался нормализовать байты в getAudioSamples(), приведя их к нормализованному значению с учетом максимального/минимального значения в файле. (Подробнее см. ниже). У меня есть простой фильтр, позволяющий оставить без изменений «тишину» (т. е. все, что ниже значения).

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

Вот сокращенная версия того, чем я сейчас занимаюсь.

Шаг 1. Найдите пики в файле:

Читает весь аудиофайл и находит самые высокие и самые низкие значения buffer.get() для всех аудиосэмплов

Код: Выделить всё

    @Override
public void onAudioSamples(IAudioSamplesEvent event) {
IAudioSamples audioSamples = event.getAudioSamples();
ShortBuffer buffer =
audioSamples.getByteBuffer().asShortBuffer();

short min = Short.MAX_VALUE;
short max = Short.MIN_VALUE;
for (int i = 0; i < buffer.limit(); ++i) {
short value = buffer.get(i);
min = (short) Math.min(min, value);
max = (short) Math.max(max, value);
}
// assign of min/max ommitted for brevity.
super.onAudioSamples(event);

}
Шаг 2. Нормализация всех значений:

В цикле, аналогичном шагу 1, замените буфер нормализованными значениями. , звоню:

Код: Выделить всё

    buffer.put(i, normalize(buffer.get(i));

public short normalize(short value) {
if (isBackgroundNoise(value))
return value;

short rawMin = // min from step1
short rawMax = // max from step1
short targetRangeMin = 1000;
short targetRangeMax = 8000;

int abs = Math.abs(value);
double a = (abs - rawMin) * (targetRangeMax - targetRangeMin);
double b = (rawMax - rawMin);
double result = targetRangeMin + ( a/b );

// Copy the sign of value to result.
result = Math.copySign(result,value);
return (short) result;
}
Вопросы:
  • Это правильный подход для попытки нормализации звука файл?
  • Правильны ли мои математические вычисления в Normalize()?
  • Почему это может привести к тому, что файл станет зашумлен, если аналогичный подход в демонстрационном коде нет?


Подробнее здесь: https://stackoverflow.com/questions/124 ... zing-audio
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Java-алгоритм нормализации звука
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Java-алгоритм нормализации звука
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Почему сбор входящего и исходящего звука приводит к искажению звука?
    Гость » » в форуме Python
    0 Ответы
    67 Просмотры
    Последнее сообщение Гость
  • Захват образца звука для передачи звука на сервер в режиме реального времени.
    Anonymous » » в форуме IOS
    0 Ответы
    120 Просмотры
    Последнее сообщение Anonymous
  • Включение звука видео при входе в раздел с помощью id="videos" и наоборот при отключении звука при выходе из раздела...
    Anonymous » » в форуме CSS
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»