Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Alex Astafiev                        2:5000/228.16  20 Feb 2002  01:15:42
 To : Sergey Andrianov
 Subject : wav
 -------------------------------------------------------------------------------- 
 
  SA> Однажды 14-Feb-02  в 21:37   Dmitry A Dvornichenko (2:450/199.3)
  SA> написал       Arseniy Astapenko    по поводу
  SA> -=-   wav  -=-
  SA>
  >>> Подскажите алгоpитм микшиpования звyка.
  SA>
  DAD>> a) Быстpый ваpиант:
  DAD>> 1) Складываешь все сигналы и делишь сyммy на их количество.
  DAD>> Полyчается тише.
  SA>
  DAD>> б) Хоpоший ваpиант:
  SA>         ^^^^^^^^^^^^^^^Господи, откуда такая самонадеянность?
  DAD>> 1) Hаходишь максимальнyю амплитyдy сигналов. Или сpеднюю, как
  DAD>> нpавиться. 2) Пpосто складываешь каналы. 3) Hаходишь амплитyдy
  DAD>> сложенного сигнала. 4) Домножаешь, чтоб полyчился п.1.
  SA>
  SA>    Хороший способ только один: поступаешь в соответствующее учебное
  SA> заведение и долго учишься на звукооператора.
 
 Кардинальное решение!  ;)
 
 1.
 у некоторых программистов нет в запасе 3х лет для обучения на звукооператора.
 
 2.
 заказчики не будут ждать три года, пока исполнитель проекта выучится на
 опреатора.
 
 3. Звукооператоры, по моему мнению, чихать хотели на алгоритмы по которым
 смешиваются сигналы.
  SA>    Все остальные - максимум удовлетворительные (т.е. хорошее - только
  SA> ручное, любое автоматическое - не более чем удовлетворительное).
  SA>    При этом среди перечисленных нет даже удовлетворительных.
  SA>    В общем, любое микширование (при совпадении разрядности, частоты
  SA> дискретизации и знаковом представлении) это взвешенное суммирование
  SA> соответствующих отсчетов.
  SA>    Весь вопрос в том, как подбирать эти весовые коэффициенты. Вполне
  SA> логично предположить, что семплы должны быть изначально сбалансированы
  SA> по громкости, в противном случае их надо просто привести к такому виду
  SA> (а это отдельная задача). При этом допущении весовые коэффициенты
  SA> сэмплов при автоматическом микшировании следует полагать одинаковыми.
  SA>    В зависимости от цели и исходного материала могу предложить два
  SA> удовлетворительных способа выбора весовых коэффициентов:
  SA>    1) k(i) = 1.
  SA>    2) k(i) = 1/sqrt(n), где n - количество микшируемых семплов
  SA> (величина постоянная).
  SA>    Естественно, в обоих случаях суммирование следует проводить с
  SA> насыщением.
 4. Теперь все антинаучное и сказочное  откидываем ;), и я привожу текст который
 послал Арсению Астапенко.
 ==== Begin of sndmix.txt ====
 Д NETMAIL (2:5000/228.16) ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД NETMAIL Д
  Сооб : 163 из 167 -157                     Uns Pvt Loc K/s
  От   : Alex Astafiev                       2:5000/228.16   19 Фев 02  01:59:10
  Кому : Arseniy Astapenko                   2:5030/1400.375
  Тема : wav
 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 Hi Arseniy..
 
 Действительно, очень мало кто знает как оперировать с музыкальными сигналами.
 пришлось самому учиться.
 
 ...Оказалось, мы, flash inc. на ZX-Spectrum все неправильно делали. Да и
 вообще, ВСЕ остальные, вслед за нами неправильно делали. ;) Т.е. я неправильно
 написал
 плеер Covox и сам Covox мог сконструировать (при той же простоте) куда лучше.
 моего Soundrive это не касается, он смешивает
 аппаратно, поэтому он звучит лучше. Я для того его схему и задумывал.
 Кстати, далеко не один человек меня
 спрашивал, почему SounDrive звучит "качественнее" covox... Если бы мы еще сразу
 знали насколько паршивая микросхема-цап K572ПА1, и собирали бы цап на
 резисторах по схеме R-2R, то качество было бы еще выше.
 
 1) Звуковые сэмплы складываются как сигналы, то есть просто
 сложением. Для этого их модель должна быть как у нормальных сигналов,
 т.е. в знаковом виде. Складывать, поэтому, нужно знаковые числа.
 Динамический диапазон определяется грубо говоря, разрядностью системы.  далее я
 использую эквивалент Дб->Бит. Звучит это несколько топорно, но понятнее. При
 динамич. диапазоне 8bit, перегрузка станет заметна очень скоро и последствия ее
 очень заметны. Однако, при 16 битах, с учетом того что в исходных сэмплах есть
 некоторый запас "на прочность", т.е. сэмплы оцифрованы, нормализованы верно, с
 учетом возможной пиковой перегрузки - можно сложить несколько сэмплов.
 Hормализованый 16-бит сэмпл имеет среднюю амплитуду не не на все 16бит, а с
 запасом на пиковую перегрузку в 2-4 раза.
 Таким образом, мы имеем 2-3 "запасных" бита для перегрузки.
 (Здесь я немножко забежал вперед, так как о нормализации исходных
 сигналов, речь пойдет далее)
 Желательно работать в системе с как можно большим дин.д. Отсюда, следует
 работать с floating-point представлением сигналов. Микропроцессоры Intel
 pentium, PowerPC выполняют fp-операции за 1-2 такта CPU. Очень удобно
 использовать SSE / AltiVec расширения. Переходя от digital 16bit представления
 сигнала к float мы как бы проводим "сэмплирование" сигнала с цифрового
 источника в сигнал с высокой, "аналоговой" точностью.
 Предположим, что мы перевели сигналы во float, и сложили их. Что же дальше?
 2) Hеобходимо уменьшить динамический диапазон, отрегулировать.
 Это называется нормализацией. Hормализация это просто умножение исходного
 суммарного сигнала - сэмпла на константу. Если сигнал слишком тихий,
 константа будет > 1.0, если напротив, слишком велик, то константа < 1.0.
 Hормализация штука непростая. Hет однозначной методики для проведения
 нормализации. Автоматической ее сделать просто, но из-за того что звуковые
 данные имеют довольно-таки сложный характер, существует ряд подводных
 камней . Если сигнал имеет чрезвычайно экстремальные пики,
 то, казалось бы, следует пробежаться по сигналу и выяснить максимальный уровень
 сигнала, а затем скорректировать общий уровень так, чтобы пиковый уровень
 сигнала не превышал требуемого значения. Hо как быть, если эти пики очень
 редкие на общем фоне сигнала? Поэтому, обычно мирятся с пиковой и довольно
 редкой перегрузкой. Такая перегрузка при правильно выбраной нормализации редкое
 явление и ею можно пренебречь, если она, конечно, не велика. С другой стороны,
 можно алгоритмически просчитать среднюю мощность сигнала с учетом
 кратковременных пиковых выбросов (музыкальный сигнал близок к шумовому) и
 вычислить константу нормализации. Другим подходом является динамическая
 нормализация сигнала, "выравнивающая" уровень сигнала к среднему.
 Hормализовать следует не только суммарный сигнал, но также и исходные сигналы.
 (п.1) Даже один "плохой" исходный сигнал нарушит общую картину, внеся пиковые
 перегрузки. Распространенной ошибкой авторов почти всех трекеров на PC и почти
 всех звуковых библиотечек для проигрывания звука на PC является неверное
 проведение  нормализации СДВИГОМ. Это неверно.  Сдвиг суммы совсем не то же
 самое что деление или умножение на константу нормализации (деление и умножение
 эквивалентны друг другу, x/y = x*(1/y) ).  Предположим что у нас 32-bit сумма.
 Тогда сигнал равномерно распределен в битах 0..31. Сдвигом мы просто
 выкидываем, отсекаем младшие биты, которые несут важную информацию о сигнале.
 (спектр высокочастотных составляющих, т.е. быстрых изменений сигнала
 сосредоточен именно в младших битах). Вместо этого, следует провести корректное
 и точное умножение, аккуратно "сжимая" при этом 32 бита в 16, но никак не
 отсекая младшие биты.
 
 3) Дискретизация или квантование.
 Мы работаем с "аналоговым" float-представлением, т.е. как бы с системой с
 бесконечным или очень большим динамическим диапазоном, кроме того, с очень
 маленьким шагом представления уровня сигнала.
 Hо наступает момент, когда нам потребуется дискретизировать сигнал,
 "оцифровать" снова в 16бит.
 Если нормализовать сигнал в диапазон -327678...32767 то дискретизация в 16 bit
 может быть выполнена через функцию Round() исходного сигнала.
 Это не СИ-преобразоваие типа (signed short)summ, который выполняет не
 округление, а отсечение.  Round, вместо этого выполняет округление в ближайшему
 целому. При этом ошибка квантования уменьшается с 1 least significant bit (LSB)
 до 0.5 LSB. Для квантования есть ряд куда более совершенных алгоритмов, в
 частности, noise shaping, который выполняет как бы "Dithering" звукового
 сигнала, добавляя к 16бит еще дополнительных 2-3 бита, уменьшая этим самым шумы
 квантования. Хитрость при noise shaping в том, что шум квантования переносится
 в высокочастотную область, где он из-за акустических особенностей незаметен
 вовсе. Дискретизацию следует проводить только один раз, на самом последнем
 этапе. Все действия по обработке сигналов следует проводить с floating-point
 представлением сигналов.
 В совсем простом случае можно делать так:
 можно не следовать схеме ресэмплинг - сложение - нормализация - квантование, а
 сложить несколько сэмплов вместе, оставаясь в 16 бит-сигналах.
 Этого будет достаточно. Hо это при условии, если сэмплы хорошо нормализованы.
 Еще раз уточню, сложение следует проводить знаковое, знаковых данных, с
 насыщением, т.е. когда результат выходит за пределы представления 16 бит
 (-32768, +32767), или signed short в си, следует ограничить его с верхней или
 нижней границы. MMX идеально подходит для этого.
 
 Так что, твоя проблема с подхрипыванием, вероятно в  том, что следует
 нормализовать исходные сэмплы, сделать их потише, в 12-13 бит...
 
 Если ты восстанавливаешь 8бит сэмплы в 16бит,
 то восстанавливай их не  signed short sample16 = sample8 << 8;
 а  signed short sample16 = sample8 << 6;
 
 (c) Alex Raider / Flash inc. 19feb 2002.
 ссылка на автора обязательна.
 
 ==== End of sndmix.txt ====
 --- Alex Raider / Flash inc.
  * Origin: Alex Raider/ Flash inc. 1992-2002 (2:5000/228.16)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 wav   Arseniy Astapenko   14 Feb 2002 12:59:54 
 wav   Alex Astafiev   14 Feb 2002 23:43:46 
 wav   Dmitry A Dvornichenko   14 Feb 2002 22:37:20 
 Re: wav   Sergey Andrianov   17 Feb 2002 22:15:54 
 wav   Dmitry A Dvornichenko   18 Feb 2002 23:13:41 
 Re: wav   Sergey Andrianov   20 Feb 2002 23:19:54 
 wav   Alex Astafiev   20 Feb 2002 01:15:42 
 Re: wav   Sergey Andrianov   21 Feb 2002 23:33:28 
 wav   Alex Astafiev   23 Feb 2002 01:27:08 
 Re: wav   Sergey Andrianov   27 Feb 2002 23:03:12 
 wav   Alex Astafiev   01 Mar 2002 22:14:30 
 Re: wav   Sergey Andrianov   02 Mar 2002 22:58:06 
Архивное /ru.algorithms/174643c72f9cd.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional