Войти
ПрограммированиеФорумОбщее

Нужен алгоритм компрессии звука (2 стр)

Страницы: 1 2
#15
13:46, 15 окт 2021

melvy
> ааа вы из этих, как там в 1969?
Нет, я сам предпочитаю C++20, но это рабочий проект на другом языке. На том языке я компрессор найти вряд ли получится, поэтому думаю, что проще найти сишный и прикрутить его. Сишный код легко прикручивается к любому другому языку без обёрток, а для C++ придётся делать сишную обёртку.

Mikle
> Вот мой компрессор из этой демки:
Спасибо, наверное его будет проще всего взять и перевести на нужный язык.

Mikle
> DSBAr() - int16 стерео выходной массив (от -32767 до 32768).
Так, а если мне нужно выводить в [-1; 1], то как бы модифицировать этот алгоритм, чтобы не делить в конце? Поделить Pre и магические константы 32000 и 767 в Sgm на 32767?
Что такое Pre, Lev? Как они полностью звучат по-английски?

Mikle
> Константы Att, Rel, Pre - атака, затухание и входная чувствительность.
Что за чувствительность? Это пороговое значение или какая-то функция от него?

Dmitry_Milk
> а вообще наверное одним бесполосным компрессором для общего случая (когда ты не
> знаешь, каким микрофоном и как записывалсь речь, кем и как сводилась музыка)
> наверное не обойтись. Скажем, если речь записывалась на конденсаторный микрофон
> с большого расстояния, то с большой вероятностью в ней будут присутствовать
> высочастотные составляющие от килогерца до четырех-пяти.
Это будет записываться айфоном (начиная от 6S и выше), вблизи. Но как оказалось, у каких-то айфонов звук получается тихим и музыка его заглушает, а у каких-то громким. И сами люди говорят по-разному. Мне кажется, тут простой нормализации в большинстве случаев должно хватить, но компрессия пригодится, если человек вдруг отдалился или заткнул пальцем микрофон. Сведением музыки занимается мой код, саму музыку выбирают наши дизайнеры и подстраивают громкость на примере. Главное, чтобы у всех пользователей запись получилась примерно как на примере.


#16
(Правка: 15:01) 14:17, 15 окт 2021

gammaker
> Что такое Pre, Lev? Как они полностью звучат по-английски?
Pre — PreSens, входная чувствительность. Чем больше её задашь — тем более слабый звук будет "вытаскиваться" компрессором, но тем более "зажатым" выйдут громкие звуки. Если предварительно нормализовать — это позволит делать PreSens меньше, меньше искажать.
Lev — Level, это внутренняя переменная, тебе не важно чего именно уровень.
gammaker
> Поделить Pre и магические константы 32000 и 767 в Sgm на 32767?
Да, это сработает, получится, что вся обработка сигнала идёт в диапазоне +-32767, а на выходе Sgm() приводит его к уровню +-1.
Нет. Нужно возвращаемое функцией Sgm значение делить на 32767:

  Select Case d
    Case Is > 32000
      d = d - 32000
      Sgm = 32000 + 767 * d / (767 + d)
    Case Is < -32000
      d = 32000 - d
      Sgm = -32000 - 767 * d / (767 + d)
    Case Else
      Sgm = d
  End Select
  Sgm = Sgm / 32767

А грамотнее привести к значениям +-1 всю логику, могу прикинуть.
Ещё, эта сигма-функция выполняет роль лимитера на моменты, когда выходное значение немного превышает диапазон. Это довольно жёсткий лимитер, рассчитанный на срез пиков ударов барабанов. Для голоса я бы делал мягче, типа так:

  Select Case d
    Case Is > 30000
      d = d - 30000
      Sgm = 30000 + 2767 * d / (2767 + d)
    Case Is < -30000
      d = 30000 - d
      Sgm = -30000 - 2767 * d / (2767 + d)
    Case Else
      Sgm = d
  End Select
  Sgm = Sgm / 32767

Можно даже ещё ослабить.
Ну и функция Sgm() должна быть float.

Страницы: 1 2
ПрограммированиеФорумОбщее