Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритмы обработки звука  (Прочитано 7858 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Nick_Kourpan
Гость
« : 12-04-2010 12:31 » 

На практике, как музыкант, много раз сталкивался с разными плагинами и железками, но когда попытался смоделировать в MATLAB и сравнить с теми же плагинами - появилось много вопросов. Наверняка здесь есть люди, разбирающиеся в этой тематике.

1. По какому принципу компрессор из состояния компрессии переходит в состояние релиза? Сколько-то времени ждет, чтобы амплитуда сигнала опустилась ниже порога и не поднималась обратно? Не очень ясно, как он отслеживает амплитуду - ведь сигнал может быть низкочастотный, например - синусоида 20гц. Период большой, пол периода сигнал с низкими значениями по y, тем не менее компрессор не переходит в релиз в этот момент. На данный момент реализовал как проверку - если N подряд идущих значений не превышают порог, то компрессор идет в релиз. Но не уверен, что это корректная реализация=)

2. Как осуществляется пересчет значения сигнала в момент компрессии? Всегда думал, что в соответствии с ratio уменьшается tmp = (cur_y - threshold), а потом new_y = threshold + tmp. Но в таком виде компрессор трещит. Кроме этого, стал сравнивать с Waves RComp - он вообще масштабирует сигнал так, что максимальный уровень равен порогу. Как же принято пересчитывать сигнал на практике?

3. Нужно построить эффект типа "эксайтер". В интернете есть статья Михаила Чернецкого, где он рассказывает в общих чертах об устройстве эксайтеров. Там есть загадочный блок генерации гармоник (http://rus.625-net.ru/archive/z0899/6.htm). Занимался ли кто-нибудь подобными алгоритмами? У меня только одно предположение - FFT, нахождение основного тона и подмешивание синусоиды с частотой в два раза больше. Но такая реализация при работе в реальном времени будет подмешивать гармоники от предыдущего фрагмента сигнала к последующему, что, видимо, не совсем правильно. Как должна реализовываться эта генерация гармоник?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 12-04-2010 13:34 » new

Ссылка на случай, если мы понимаем процесс по-разному:
http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%80%D0%B5%D1%81%D1%81%D0%BE%D1%80_%D0%B0%D1%83%D0%B4%D0%B8%D0%BE%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D0%B0

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


Думаю, что логику компрессора описать однозначно нельзя - она зависит от назначения. Скажем, в примитивном виде - ограничитель уровня:

При уровне ниже порога:
yn = xn

При превышении порога:
yn = k * (xn - p) + p

p - порог,
k - 1/ratio


Предлагаю еще такой вариант:

yn = f(xn) * xn

Здесь множитель (усиление) меняется сразу по изменении сигнала, но размазано во времени - ступенчато.

Логика множителя f():
1. Исходно множитель = 1.
2. По достижении сигналом порога множитель начинаем линейно ступенчато менять от текущего состояния до 1/ratio (0..1).
3. Если множитель не равен 1 и сигнал менее порога, то ступенчато приводим его к 1.

Ступенька на семпл = (1 - 1/ratio) / (Частота дискретизации * время реакции)


Еще вариант - модернизация предыдущего варианта: ввести задержку. Тогда множитель начнет уменьшаться заранее, при приближении к порогу (с предсказанным его превышением).
Формула такая:

yn - z = f(xn) * xn - z

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

« Последнее редактирование: 12-04-2010 13:56 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 12-04-2010 14:06 » 

По вопросу 3.
Другой вариант: после FFT производить нелинейное усиление для искажения синусоиды (синусоида->колокол->трапеция->меандр) - это добавляет гармоник. Наверно за выбором подходящего закона искажения стоит обратиться к математике - рядам Фурье. Затрудняюсь сказать, как это выглядит на практике - не продумывал деталей.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines