Фильтрация и искажение звука, хранящегося в байтовом массиве Java - PullRequest
0 голосов
/ 18 марта 2020

Я еще не начал кодировать раздел, но мне было интересно, если у кого-то есть предварительные знания о решении для этого / есть какие-либо источники, которые будут полезны для него.

Я пытаюсь эмулировать насыщение ленты на байтовом массиве 16,1-битных (мало-порядковых) аудиоданных 44,1 кГц PCM, которые уже были записаны (у меня есть класс записи, уже готовый и работающий). Я хочу исказить и отфильтровать байты данных, чтобы эмулировать звук ленты.

Теоретически я думаю, что нам нужно использовать симметричное мягкое ограничение для искажения (я посмотрел на примере на странице 118 в этом учебнике для цифрового аудио FX, я просто не знаю, как его реализовать: https://books.google.it/books?id=h90HIV0uwVsC&printsec=frontcover&hl=en#v = одна страница & q & f = false ), а затем отфильтровать весь сигнал с помощью фильтра низких частот?

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

1 Ответ

1 голос
/ 18 марта 2020

Необходимые элементы:

  • чтение байтов (возможно, до AudioInputStream, если данные не хранятся в массиве памяти)
  • преобразование байтов аудиоданных в PCM
  • oversample
  • применить функцию искажения
  • сглаживающая фильтрация
  • decimate
  • преобразовать обратно в байты
  • вывод через SourceDataLine

Я не знаю, какой алгоритм искажения может быть лучшим для ваших целей. В бесплатной книге *1025* Physical Audio Signal Processing есть несколько предложений. Я вспоминаю, что в CCRMA Стэнфордского университета тоже было несколько интересных статей по этому поводу, но у меня нет удобных ссылок.

Мое личное любимое искажение - функция tanh. Код Java, который я использую для синтезированного патча, который получает довольно сильное гитароподобное искажение, выглядит следующим образом:

float distortVal = (float)Math.tanh(noteVal * (1 + timbreNormal * 5));

В этом случае noteVal - это одно значение PCM. У меня есть переменная timbreNormal в диапазоне от 0 до 1, и я читаю ее из эквивалента контроллера педали. Значение 5 паттерна "magi c number" - это константа, которую я лениво вставляю. Она определяет максимальную величину, на которую сигнал усиливается перед применением алгоритма искажения. Какой бы алгоритм искажения вы ни использовали, интенсивность искажения будет зависеть от степени усиления сигнала до применения алгоритма. Если вы хотите более тонкий эффект, значение «число волшебный c» может быть установлено ниже.

Чрезмерная выборка очень помогает при фильтрации. Я передискретизировал 8 и использую двухполюсный фильтр Баттерворта. Мне пришлось бы сделать несколько значительных копаний, чтобы найти значения, используемые в конструкции фильтра. Но я думаю, что вы можете понять суть программы из этого ответа.

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